消除operator []绑定的歧义

时间:2009-02-12 00:39:00

标签: c++

我正在尝试从开源项目中编译代码,而我遇到了一个问题,即gcc声称特定的代码行有一个模糊的解释。问题涉及模板化的类和这两种方法:

template <class X>
class A {
public:
    X& operator[] (int i) { ... }
    operator const X* () { ... }
};

当按照以下方式使用时:

A<B*> a;
B* b = a[i];

gcc抱怨a [i]的模糊解析。通过将A的定义替换为其特定的实例化,可以更清楚地解决问题:

class A_B {
public:
    B*& operator[] (int i) { ... }
    operator B* const * () { ... }
};

问题在于有两种解释方式B * b = a [i]:

// First interpretation (array-like behaviour first)
B*& b1 = a[i];
B* b2 = (B*) b1;

// Second interpretation (casting behaviour first)
B* const * b1 = (B* const *) a;
B* b2 = b1[a];

我的问题是:有没有办法提供一个首选的解释,最好是在没有显式强制转换的情况下使得转换版本不受欢迎,这样我就不必修改试图调用A []的每一行?我意识到解释是合法的模糊,但我知道代码的意图是什么,并且我想以最小的改变将它传达给编译器。

编辑:我的示例似乎没有引起问题,所以我没有正确总结原始代码,也没有正确识别问题。我会尝试先得到一个产生问题的例子,抱歉的人。

3 个答案:

答案 0 :(得分:2)

您可以使用大括号:

A<B*> a;
B* b = (a[i]); // Now it must evaluate the sub-expression a[i]

NB。上面的示例编译正常,并按预期调用operator []。

答案 1 :(得分:2)

以下代码使用g ++ 3.x为我编译。我不认为你对问题的分析是正确的,但无论如何你可以发布你得到的错误信息。

template <class X>
struct A {
    X& operator[] (int i) { static X x; return x; }
    operator const X* () { return 0; }
};

class B {};

int main() {
    A<B*> a;
    B* b = a[0];
}

答案 2 :(得分:0)

您可以强制编译器绑定到operator [ ]

B* b = a::operator [ ] ( 0 );

但无论如何,定义转换总是一个坏主意。在使用转换运算符之前,我会在其周围搜索它。