這很容易理解爲什麼我們不能說:有沒有辦法強制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)
...不需要任何指定。
對不起,關於罐頭的例子。我的意思是不切割和粘貼不僅不能複製和粘貼,我不能解釋我正在嘗試做什麼,因爲規則和條例。
無法剪切和粘貼代碼是沒有藉口發佈的東西,不會證明你所指的錯誤,如果你可以在SO上發佈,你可以在ideone.com,gcc.godbolt在線測試代碼。 org,liveworkspace.org等 - 我認爲診斷來自「pedantic」只有 – 2013-02-21 01:18:03
@JonathanWakely需要沒有肇事者。請參閱編輯。 – user2093476 2013-02-21 01:58:47
這只是一個警告,所以GCC _does_知道該選哪個。但是我無法重現那個警告,您使用的是哪個版本? – 2013-02-21 02:19:11