-1

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());  
}  

何が問題なのですか?

4

2 に答える 2

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 ‘&gt;’ token
template.cpp:6: error: ‘vec’ was not declared in this scope

最初の行は、次のものと非常によく似ています。

removeDup is not a function or static data member
于 2012-09-14T22:06:32.300 に答える
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
于 2012-09-14T22:11:17.887 に答える