【发布时间】:2011-10-21 21:43:55
【问题描述】:
在尝试编译这个程序时:
namespace MyNamespace {
template<typename T>
class Test {
public:
class Inner {
int x;
public:
Inner() : x(0) { }
friend Inner& operator++(Inner& rhs);
};
Inner i;
};
}
template<typename T>
typename MyNamespace::Test<T>::Inner& operator++(typename MyNamespace::Test<T>::Inner& rhs) {
rhs = MyNamespace::Test<T>::Inner(rhs.x + 1);
return rhs;
}
int main() {
MyNamespace::Test<int> t;
MyNamespace::Test<int>::Inner i = t.i;
++i;
}
我得到了错误
未解析的外部符号“class MyNamespace::Test::Inner & __cdecl MyNamespace::operator++(class MyNamespace::Test::Inner &)”(??EMyNamespace@@YAAAVInner@?$Test@H@0@AAV120 @@Z) 在函数_main中引用
这很奇怪,因为这是我定义的非会员朋友函数operator++ 的确切签名。我该如何解决?而且我没有将 in 作为成员函数包含在内的选项,因为我需要在不使用复制构造函数的情况下更改操作数所引用的对象(因为没有复制构造函数)。
更新:
如果我在friend Inner&... 上方添加template<typename T>,则会出现错误
could not deduce template argument for 'T' 1>
main.cpp(21) : see declaration of 'operator
++'
error C2783:
'MyNamespace::Test<T>::Inner &MyNamespace::operator++(MyNamespace::Test<T>::Inner &)' : could not deduce template
argument for 'T' with
[
T=int
]
main.cpp(13) : see declaration of
'MyNamespace::operator ++'
main.cpp(30): error C2675: unary '++' : 'MyNamespace::Test<T>::Inner' does not define this operator or a
conversion to a type acceptable to the predefined operator
with
[
T=int
]
【问题讨论】:
标签: c++ templates operator-overloading linker-errors