1

次のコードでエラーが発生する理由を理解できません。

template <typename T>
class Test{
    void foo(vector<T>& v);
};

template <typename T>
void Test<T>::foo(vector<T>& v){
    //DO STUFF
}

int main(){
      Test<int> t;
      t.foo(vector<int>());
}

これはエラーです:

main.cpp: In function ‘int main()’:
main.cpp:21:21: error: no matching function for call to ‘Test<int>::foo(std::vector<int, std::allocator<int> >)’
main.cpp:21:21: note: candidate is:
main.cpp:14:6: note: void Test<T>::foo(std::vector<T>&) [with T = int]
main.cpp:14:6: note:   no known conversion for argument 1 from ‘std::vector<int, std::allocator<int> >’ to ‘std::vector<int, std::allocator<int> >&’

私は何を間違っていますか?

4

2 に答える 2

9

const一時を非参照にバインドすることはできません。

署名を次のように変更します。

void foo(vector<T> const& v);

または一時的に渡さないでください:

vector<int> temp;
t.foo(temp);
于 2012-06-15T13:57:15.440 に答える
1

クラスを宣言(通常は.hファイルに含まれるもの)と定義(.cppファイルに含まれるもの)に分離しようとしているようです。ただし、テンプレートの性質上、クラスのすべてのコードをヘッダーに配置するのが一般的な方法です。テンプレートコードは、コードの使用時に型情報が変わるため、プリコンパイルできません(つまり、共有ライブラリやDLLにコンパイルできません)。

TLDR:「// DO STUFF」と書かれている部分...それをヘッダーに入れて、対応する.cppにある可能性のあるものをすべて削除します。

于 2012-06-15T14:03:34.873 に答える