gpt4 book ai didi

c++ - 带有运算符重载和模板的未解析外部符号

转载 作者:搜寻专家 更新时间:2023-10-31 01:56:31 26 4
gpt4 key购买 nike

在尝试编译这个程序时:

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;
}

我得到了错误

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

这很奇怪,因为那是非成员好友函数的确切签名 operator++我定义的。我该如何解决?而且我没有将 in 作为成员函数包含在内的选项,因为我需要在不使用复制构造函数的情况下更改操作数所引用的对象(因为没有复制构造函数)。


更新:

如果我添加 template<typename T>friend Inner&... 之上, 我得到错误

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
]

最佳答案

为什么你认为它不能是一个成员函数?实例成员应该工作得很好:

namespace MyNamespace
{
template<typename T>
class Test
{
public:
class Inner
{
int x;
public:
Inner& operator++( void ) { ++x; return *this; }
};

Inner i;
};
}

这不需要复制构造函数。

定义 friend 也应该有效,只要定义与 friend 声明一起:

namespace MyNamespace
{
template<typename T>
class Test
{
public:
class Inner
{
int x;
public:
friend Inner& operator++( Inner& operand ) { ++operand.x; return operand; }
};

Inner i;
};
}

根据 [class.friend]

,友元函数将放置在命名空间范围内

关于c++ - 带有运算符重载和模板的未解析外部符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6974319/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com