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: The part where it says "// DO STUFF"... put that in the header and delete anything you may have in the corresponding .cpp.

于 2012-06-15T14:03:34.873 回答