2013-02-21 35 views
0

這很容易理解爲什麼我們不能說:有沒有辦法強制gcc/g ++中的函數解析優先級?

template<class A> class foo 
{ 
    //stuff 
    A& operator[](size_type n); 
    operator A*(); 
    //more stuff 
}; 

somefooinstance[bar]; 

...我們回來ISO C++說:」這些都是模棱兩可的,即使第一個最壞的轉換比第二最壞的轉換更好。 「

這意味着,當然,是GCC不知道,如果我們的意思是:

somefooinstance.operator[](bar); 

或我們的意思是:

(static_cast<A*>(somefooinstance))[bar]; 

現在,ISO C++說,所有的轉換必須考慮,是嗎?但是沒有辦法強制選擇優先權? 屬性似乎沒有提供任何有用的東西。

(請,沒有「什麼是你真正想要做什麼?」回答是,這是一個罐頭例如山姆大叔不希望我剪切和粘貼代碼。)

編輯:

有人想看到確切的代碼:

template<class T, unsigned S> class foo 
    { 
    private: 
     T m_bar[S]; 

    public: 
     inline T& operator[](unsigned s) 
     { 
      return m_bar[s]; 
     } 

     inline operator T*() 
     { 
      return m_bar; 
     } 

    }; 

    int main(int argc, char** argv) 
    { 
     foo<int, 100> test; 
     test[31] = 6; 
    } 

產量:

23:警告:ISO C++說,這些都是不明確的,即使第一個最壞的轉換比用於第二最壞轉換更好:

8:注:候選1:T & FOO ::操作符[](無符號整數)[用T = INT,無符號整型S = 100U]

23:注:候選人2:運算符[](int *,int)

...不需要任何指定。

對不起,關於罐頭的例子。我的意思是不切割和粘貼不僅不能複製和粘貼,我不能解釋我正在嘗試做什麼,因爲規則和條例。

+2

無法剪切和粘貼代碼是沒有藉口發佈的東西,不會證明你所指的錯誤,如果你可以在SO上發佈,你可以在ideone.com,gcc.godbolt在線測試代碼。 org,liveworkspace.org等 - 我認爲診斷來自「pedantic」只有 – 2013-02-21 01:18:03

+0

@JonathanWakely需要沒有肇事者。請參閱編輯。 – user2093476 2013-02-21 01:58:47

+1

這只是一個警告,所以GCC _does_知道該選哪個。但是我無法重現那個警告,您使用的是哪個版本? – 2013-02-21 02:19:11

回答

0

在C++ 11可以使轉換操作符明確:

explicit operator A*(); 

那麼它只會在情況下使用像static_cast<A*>(somefooinstance)

相關問題