具有运算符重载和模板的未解析的外部符号
在尝试编译此程序时:
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++
的确切签名定义的。我该如何解决这个问题?而且我无法选择将其包含为成员函数,因为我需要更改操作数所引用的对象而不使用复制构造函数(因为没有复制构造函数)。
Update:
如果我在 friend Inner&...
上方添加 template
,我会收到错误
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
]
In trying to compile this program:
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;
}
I get the error
unresolved external symbol "class MyNamespace::Test::Inner & __cdecl MyNamespace::operator++(class MyNamespace::Test::Inner &)" (??EMyNamespace@@YAAAVInner@?$Test@H@0@AAV120@@Z) referenced in function _main
Which is weird because that's the exact signature of the non-member friend function operator++
that I defined. How do I fix this? And I do not have the option of including in as a member function because I need to change the object that the operand is referring to without using a copy constructor (because there is no copy constructor).
Update:
If I add template<typename T>
above the friend Inner&...
, I get the errors
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
]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
![扫码二维码加入Web技术交流群](/public/img/jiaqun_03.jpg)
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
为什么你认为它不能是成员函数?实例成员应该可以正常工作:
这不需要复制构造函数。
定义友元也应该有效,只要定义带有友元声明即可:
根据
[class.friend]
,友元函数将被放置在命名空间范围内Why do you think it can't be a member function? An instance member should work just fine:
This doesn't require a copy constructor.
Defining a friend should work too, as long as the definition is with the friend declaration:
The friend function will be placed at namespace scope, according to
[class.friend]