如何使用operator ==强制编译器警告?

时间:2012-12-06 02:42:57

标签: c++ objective-c operator-overloading compiler-warnings objective-c++

这是我earlier question的后续内容。

我有一堆像这样的Objective-C代码:

typedef long DataKey;

DataKey x;
DataKey y;

if (x == y) {
    // do stuff
}

我现在需要将DataKey更改为对象而不是long。如果我创建类并进行一系列全局搜索和替换,我的代码现在就像这样:

@interface DataKey : NSObject

DataKey *x;
DataKey *y;

if (x == y) { // uh-oh - this is now bad, I need isEqual: here
}

由于没有编译器警告要使用==运算符检测两个对象指针,我正在寻找另一种解决方案。

一种想法是使用C ++类并以编译器会抱怨的方式重载==运算符。

我不太了解C ++和Objective-C。我已经能够编写C ++类,现在我的代码实际上会导致调用operator==方法。现在我需要帮助提出一种调整代码的方法,以便我收到编译器警告。

这是C ++类:

class DataId {
public:
    DataId();

    bool operator==(const DataId &other);
};

现在我有一些像这样的Objective-C ++代码:

DataId x;
DataId y;

if (x == y) { // I need a compiler warning/error here
}

是否有语法技巧可以在if语句中引发编译错误/警告。

3 个答案:

答案 0 :(得分:4)

您是否尝试过根本不定义operator==?我认为C ++类没有隐式operator==。因此,如果您不考虑operator==的定义,那么您的最后一段代码应该抛出编译器错误。

答案 1 :(得分:1)

只是使operator==未定义和私有应该触发错误。但是如果你想比较2个对象,我不明白你为什么不在你需要的时候定义operator==

bool operator==(const DataId &other){
    return IsEqual(other);//is this the function you want to compare with?
}

答案 2 :(得分:-1)

<击> 如果您有权访问C ++ 11,则可以使用static_assert:

class DataId {
    // ...

    bool operator==(const DataId& other)
    {
        static_assert(false, "enter error message here.");
        return true;
    }
};

<击>

根本不要定义operator ==并且编译器将在使用时失败并显示错误。