使用MSVC和g ++中的模板进行差异

时间:2014-11-18 12:58:21

标签: c++ visual-c++ g++

在将代码从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

经过一个小时的询问谷歌我不知道发生了什么。

1 个答案:

答案 0 :(得分:4)

TArray是一个从属名称,因此您需要使用typename,如下所示:

typedef typename TArray::iterator iter;

这&#34;应该&#34; (着名的遗言)也在MSVC工作。

这是一本我可以推荐的书,它非常彻底地解释了这个:

C++ Templates: The Complete Guide