0

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

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);
};
4

3 回答 3

2

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

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

于 2013-04-06T12:02:46.693 回答
1
set<const _Type & > values;

您已将参考作为集合的元素类型提供。容器不能携带它们需要指针的引用。

set<const _Type*> values;
于 2013-04-06T12:02:19.360 回答
1
/*typename(?)*/ set<const _Type & > values; // problem
                               ^^^

因为您不能在 STL 容器中使用引用作为类型,所以请改用指针:

set<const _Type*> values;
于 2013-04-06T12:07:08.530 回答