功能模板中的奇怪错误

时间:2012-09-14 21:57:46

标签: c++ templates

我正在学习C ++中的函数模板,所以我编写了一个简单的函数来删除重复项。但是编译器会抛出以下错误。

removeDup is not a function or static data member

using namespace std;  
template <typename T>  
void removeDup(std::vector<T>& vec)  
{  
        std::sort(vec.begin(), vec.end());  
        vec.erase(std::unique(vec.begin(), vec.end()), vec.end());  
}  

可能是什么问题?

2 个答案:

答案 0 :(得分:3)

编译器的错误通常是相关的。例如,如果你不匹配块括号,可能会产生许多不在范围内的标识符。通常,第一个是根本原因,并且很容易忽视其余部分。在这种情况下,后来的错误很重要,第一个很明显。

未能包含堆栈使removeDup混淆了编译器,它首先抱怨removeDup。

添加完成后,代码编译好了:

#include <vector>
#include <algorithm>

之前using namespace std;

如果没有这些包含,这是我从gcc 4.2(愚蠢的Mac)得到的错误:

template.cpp:6: error: variable or field ‘removeDup’ declared void
template.cpp:6: error: ‘vector’ is not a member of ‘std’
template.cpp:6: error: expected primary-expression before ‘>’ token
template.cpp:6: error: ‘vec’ was not declared in this scope

第一行非常接近:

removeDup is not a function or static data member

答案 1 :(得分:2)

这对我来说很好用:

#include <vector>
#include <algorithm>
#include <iostream>

using namespace std;  
template <typename T>  
void removeDup(std::vector<T>& vec)  
{  
        std::sort(vec.begin(), vec.end());  
        vec.erase(std::unique(vec.begin(), vec.end()), vec.end());  
}  

int main()
{

    int values[] = {1,2,3,3,3};
    vector<int> ints(values, values + 5);
    removeDup(ints);

    for (vector<int>::iterator it=ints.begin(); it!=ints.end(); ++it)
        cout << " " << *it;
    return 0;
}

$ g++ c.cpp
$ ./a.out
1 2 3