模板C++类声明中的类型/值不匹配

type/value mismatch in template C++ class declaration

本问题已经有最佳答案,请猛点这里访问。

我尝试使用GCC4.2在Linux上编译以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <map>
#include <list>

template<typename T>
class A
{
...

private:
    std::map<const T, std::list<std::pair<T, long int> >::iterator> lookup_map_;
    std::list<std::pair<T, long int> > order_list_;

};

当我编译这个类时,我从GCC收到以下消息:

1
2
3
error: type/value mismatch at argument 2 in template parameter list fortemplate<class _Key, class _Tp, class _Compare, class _Alloc> class std::map
error:   expected a type, got ‘std::list<std::pair<const T, long int>,std::allocator<std::pair<const T, long int> > >::iterator
error: template argument 4 is invalid

我已经删除了文件名和行号,但它们都是指声明映射的行。

当我用int或某种具体类型替换这些表达式中的对时,它编译得很好。有人能告诉我我做错了什么吗?


您需要在std::list<...>::iterator之前编写typename,因为iterator是嵌套类型,您正在编写模板。

编辑:如果没有typename,gcc假设(根据标准要求)iterator实际上是list中的静态变量,而不是类型。因此出现"参数类型不匹配"错误。


您的代码需要一个"typename"关键字。

1
    std::map<const T, typename std::list<std::pair<T, long int> >::iterator> lookup_map_;