在下面的代码中,如果我注释掉aaa
或bbb
,它将会编译。为什么我不能同时拥有两者?
#include <iostream>
class MyClass
{
private:
typedef void (MyClass::*aaa)() const;
typedef void (MyClass::*bbb)() const;
void ThisTypeDoesNotSupportComparisons() const {}
public:
operator aaa() const { return (true) ? &MyClass::ThisTypeDoesNotSupportComparisons : 0; }
operator bbb() const { return (true) ? &MyClass::ThisTypeDoesNotSupportComparisons : 0; }
};
int main()
{
MyClass a;
MyClass b;
if(a && b) {}
}
答案 0 :(得分:6)
aaa
和bbb
的typedef是相同的。因此,您的转换运算符实际上声明了相同的功能。
基本上,编译器会看到
operator void (MyClass::*)() const { ... }
两次,一次用于aaa
,一次用于bbb
。
答案 1 :(得分:1)
因为两者都是使用不同名称定义相同类型的类型。
aaa
是指向MyClass
的成员函数的指针,该函数不接受任何参数并返回void
。
bbb
也是一回事。