具有运算符重载和模板的未解析的外部符号

发布于 2024-11-28 11:35:32 字数 1745 浏览 1 评论 0原文

在尝试编译此程序时:

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技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

盛夏尉蓝 2024-12-05 11:35:32

为什么你认为它不能是成员函数?实例成员应该可以正常工作:

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

        Inner i;
    };
}

这不需要复制构造函数。

定义友元也应该有效,只要定义带有友元声明即可:

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],友元函数将被放置在命名空间范围内

Why do you think it can't be a member function? An instance member should work just fine:

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

        Inner i;
    };
}

This doesn't require a copy constructor.

Defining a friend should work too, as long as the definition is with the friend declaration:

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

        Inner i;
    };
}

The friend function will be placed at namespace scope, according to [class.friend]

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文