我不明白这个错误的原因:
#include <iostream>
using namespace std;
// LNK2019f.cpp
// LNK2019 expected
template<class T>
void f(T) {}
template<class T>
struct S {
friend void f(T);
// try the folowing line instead
// friend void f<T>(T);
};
int main() {
S<int> s;
int a = 2;
f(a); // unresolved external
}
源自http://msdn.microsoft.com/en-us/library/799kze2z(v=vs.80).aspx
如果我将S<int> s注释掉,为什么错误就不会显示呢?我知道需要声明模板参数列表,但我看不出那个带有模板的结构与f(a)调用之间的联系。
另一个奇怪的事情是:如果我只注释掉f(a)的调用(并保留所有其余内容),它会再次编译。我使用的是MSVC2012。
f
的函数声明,这个函数隐藏了你的模板函数。顺便说一下,我观察到typename
实际上并不是必要的。我会检查并相应地进行编辑。 - Sebastian Hoffmann