在将代码从Windows移植到Linux时,模板遇到了奇怪的问题。
提供的样本与MSVC一起编译并且完美无缺。
代码示例:
#include <vector>
#include <iostream>
typedef std::vector<int> IntArray;
template <typename TArray>
void printArray(TArray a)
{
typedef TArray::iterator iter;
for (iter it = a.begin(); it != a.end(); ++it)
std::cout << *it << std::endl;
}
int main()
{
IntArray a;
a.push_back(1);
a.push_back(2);
a.push_back(3);
printArray(a);
return 0;
}
但是g ++抱怨
In function ‘void printArray(TArray)’:
bar.cpp:9: error: expected initializer before ‘iter’
bar.cpp:10: error: ‘iter’ was not declared in this scope
bar.cpp:10: error: expected ‘;’ before ‘it’
bar.cpp:10: error: ‘it’ was not declared in this scope
经过一个小时的询问谷歌我不知道发生了什么。
答案 0 :(得分:4)
TArray
是一个从属名称,因此您需要使用typename
,如下所示:
typedef typename TArray::iterator iter;
这&#34;应该&#34; (着名的遗言)也在MSVC工作。
这是一本我可以推荐的书,它非常彻底地解释了这个: