访问托管引用属性的重载运算符时的编译错误

时间:2015-01-18 18:37:34

标签: properties reference c++-cli operator-overloading

我收到编译错误

  

test.cpp(21):错误C2676:二进制'+':'Manager ^'没有定义   此运算符或转换为预定义可接受的类型   操作

尝试编译以下程序时。

public ref class Managed {};

public ref class Manager {
    public:
        Manager^ operator += (Managed^ m) { list->Add(m); return this; }
    private:
         System::Collections::Generic::List<Managed^>^ list;
};

public ref class Foo {
    public:
        property ::Manager^ Manager {
            ::Manager^ get() { return manager; }
        }
    private:
        ::Manager^ manager;
};

int main() {
    Foo^ foo = gcnew Foo;
    foo->Manager += gcnew Managed;  // Line 21
}

当我将main函数替换为下面的函数时,程序将编译。

int main() {
    Foo^ foo = gcnew Foo;
    Manager^ mgr = foo->Manager;
    mgr += gcnew Managed;
}

两者之间的本质区别是什么,使得一个编译而不是另一个?

1 个答案:

答案 0 :(得分:2)

根据MSDN documentationoperator+=不是允许的C ++ / CLI用户定义运算符之一。相反,应定义operator+,编译器会将+=翻译为+,然后=(分配)。

如果您在operator+课程中添加了Manager,然后将set(::Manager^)添加到Foo::Manager媒体资源中,则第21行会进行编译。