我正在学习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());
}
可能是什么问题?
答案 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