1

当我尝试编译模板类时,出现以下错误:

C.cpp: In member function 'void PeriodContainerAdvanced<T>::add()':
C.cpp:133: error: type/value mismatch at argument 1 in template parameter list for 'template<class _T1, class _T2> struct std::pair'
C.cpp:133: error:   expected a type, got 'std::map<int,T,std::less<int>,std::allocator<std::pair<const int, T> > >::iterator'
C.cpp:133: error: invalid type in declaration before ';' token

Ch 文件中的类:(简化)

template <class T>
class PeriodContainerAdvanced 
{
[skip]
    void add (); 
[skip]
}

C.cpp(简体):

template <class T>
void PeriodContainerAdvanced<T>::add()
{
[skip]
    std::pair<std::map< time_t, T >::iterator, bool> ret; // line 133 !
[skip]
}

以及尝试定义时其他功能的类似错误

std::map< time_t, T >::iterator it, it_start, it_end; // line 153

在这一行编译器说:

C.cpp:153: error: expected `;' before 'it'
C.cpp:166: error: 'it_start' was not declared in this scope

如何解决?谢谢

4

2 回答 2

9

这是一个从属名称,您需要将其声明为:

std::pair<typename std::map< time_t, T >::iterator, bool> ret;

此外,为了避免以后的链接器错误,您应该将模板实现移动到对使用该模板的所有翻译单元可见的文件中 - 就像您定义模板类的标题一样。

于 2012-04-25T14:57:41.400 回答
6

首先,需要将add()实现放在头文件中,或者放在头文件包含的文件中。编译器需要查看代码才能实例化给定的模板T

其次,你引用的错误来源,你需要加一个typename告诉编译器你说的是一个类型。std::map< time_t, T >::iterator可以解释为一个值。

template <class T>
class PeriodContainerAdvanced {
  void add () {
    std::pair<typename std::map< time_t, T >::iterator, bool> ret;
    ....         ^
  }
};
于 2012-04-25T14:59:23.287 回答