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

Properties 访问托管引用属性的重载运算符时发生编译错误,properties,reference,c++-cli,operator-overloading,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:

我得到了编译错误

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
}
这两者之间的本质区别是什么,使得一个可以编译,而另一个不能编译?

根据,
操作符+=
不是允许的C++/CLI用户定义操作符之一。相反,应该定义
运算符+
,编译器将
+=
翻译成
+
,然后是
=
(赋值)


如果您将<代码>运算符+<代码>添加到<代码>管理器< /C>类,然后将<代码> SET(::Manager ^)<代码> >到您的代码> Fo::Manager 属性,第21行编译.< /P> C++中的操作符重载是不规则的,CLS规则与C++实践冲突太重。CLS要求它们是静态成员,属性不是l值。他们尽了最大的努力。
int main() {
    Foo^ foo = gcnew Foo;
    Manager^ mgr = foo->Manager;
    mgr += gcnew Managed;
}