Properties 访问托管引用属性的重载运算符时发生编译错误
我得到了编译错误 test.cpp(21):错误C2676:二进制“+”:“Manager^”未定义 此运算符或转换为预定义对象可接受的类型 接线员 当试图编译以下程序时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:
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;
}