2009-02-12 120 views
2

我想從一個開源項目中編譯代碼,而且我遇到了gcc聲稱特定行代碼含糊不清的解釋的問題。該問題涉及模板類和這兩種方法:歧義運算符[]綁定

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

當此沿該線中使用:

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

GCC抱怨的[I]的曖昧分辨率。該問題通過與它的特定實例替換A的定義變得更加清楚:

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

的問題是,有解釋B * B的兩種方式= A [1]:

// 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 []的每一行?我意識到解釋是合法的,但我知道代碼的意圖是什麼,我想通過最少的更改與編譯器進行交流。

編輯:看來我的例子不會導致問題,所以我沒有正確地總結原始代碼,也沒有正確地識別問題。我會試着首先得到一個能夠產生問題的例子,抱歉的人們。

+0

你確定還有其他事情沒有進行嗎?我用gcc -Wall編譯了你的例子,它沒有給出太多的窺視。 – 2009-02-12 00:54:52

回答

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

你可以使用大括號:

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

NB。你上面的例子編譯得很好,並按預期調用operator []。

0

您可以強制編譯器通過這個綁定到operator [ ]

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

但無論如何,定義轉換始終是一個壞主意。在使用轉換操作符之前,我會以其他方式搜索它。