我没有收到此错误:
#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 http://msdn.microsoft.com/en-us/library/799kze2z(v=vs.80).aspx
为什么我注释掉后不显示错误S s?我知道我还需要声明模板参数列表,但我没有看到该模板化结构和f(a) call..
另一个奇怪的事情:如果我只注释掉f(a)调用(我将其余所有内容保留在原处),它会再次编译。我用的是MSVC2012。
发生错误的原因是您的友元声明充当另一个非模板化的函数声明f
功能。
你必须这样声明它才能告诉编译器它是一个模板函数:
friend void f<T>(T);
考虑以下示例:
template<class T>
struct S {
friend void foo(int);
};
int main() {
S<int> s;
foo(42);
}
这将抛出一个链接器错误,提示未解析的外部符号foo
这里。在这种情况下foo
已通过友元声明声明但未定义。
如果我们现在注释掉S<int> s;
我们现在得到的不是链接器而是编译器错误:'foo': identifier not found
, 因为foo
尚未宣布,因为S<int>
未编译。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)