c++ - 使用 STL 的类模板无法编译

标签 c++ templates stl

我是模板的新手,正在尝试编译这段代码:

template <typename _Type, typename _Comparator = std::equal_to<_Type> >
    class CSearch {
public:
    CSearch() : cmp(_Comparator()) {
    }

    CSearch(const _Comparator &_cmp) : cmp(_cmp) {
    }

    void Add(int id,
            const _Type & needle) {
        values.insert(needle); // problem
    }

    set<int> Search(const _Type & hayHeap) const {

    }
private:
    const _Comparator &cmp;

    /*typename(?)*/ set<const _Type&> values; // problem

    CSearch(const CSearch &other);
    CSearch &operator=(const CSearch &other);
};

(...)

int main(){
    CSearch <string> test;
}

我做了一些搜索,我怀疑问题出在 typename 关键字上。但是,无论我如何尝试,我都找不到解决方案。

当有类型名时,我得到 expected nested-name-specifier 错误。如果不是,我会得到一个非常长的 STL 错误。

有什么收获?谢谢


编辑:这个场景怎么样,我尝试在 STL 中存储指向对象的指针?

template <typename _Type>
class Needle {
public:
    int ID;
    _Type *data;
};

template <typename _Type, typename _Comparator = std::equal_to<_Type> >
        class CSearch {
public:

    CSearch() : cmp(_Comparator()) {
    }

    CSearch(const _Comparator &_cmp) : cmp(_cmp) {

    }

    void Add(int id,
            const _Type & needle) {
        Needle<_Type> *tmp = new Needle<_Type>();
        tmp -> ID = id;
        tmp -> data = &needle;
        values.insert(tmp);
    }

    set<int> Search(const _Type & hayHeap) const {

    }
private:
    const _Comparator &cmp;

    set<const Needle*> values;

    CSearch(const CSearch &other);
    CSearch &operator=(const CSearch &other);
};

最佳答案

首先,_Foo 或 _Bar 之类的东西不适合您使用,不要从标准库的实现中复制该习惯。此外,它不会让事情更容易阅读或写作。

现在,您的代码中的问题是您正在尝试创建一组引用,但引用不是容器的有效元素。那里不需要“typename”,因为那里没有使用依赖类型。

关于c++ - 使用 STL 的类模板无法编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15850638/

相关文章:

c++ - 为使用数组、 vector 、结构等传递给可变参数函数或可变参数模板函数的所有参数指定一种类型?

c++ - 如何将派生类的 shared_ptr vector 转换为基类的 shared_ptr vector

c++ - 对列表进行排序并返回其原始顺序或下标

c++ - Clang 文档页面中的代码片段

c++ - 使用基本模板标识符时继承

c++ - 就地 std::copy_if

c++ - 在std::set中按键查找

c++ - pushing_back 时跳过 vector 位置

c++ - 如何安全地将包含的对象(菜单项)与需要容器(菜单)的 API 同步?

c++ - 将集合论应用于 C++11 可变参数模板