[英]Ambiguous call to overloaded static function
我對這種情況很困惑,谷歌搜索沒有給我答案。 基本上我有以下不編譯的簡單代碼:
#include <iostream>
class A
{
public:
int a(int c = 0) { return 1; }
static int a() { return 2; }
};
int main()
{
std::cout << A::a() << std::endl;
return 0;
}
在編譯時,GCC 4.2表示對main()
A::a()
的調用與a()
有效候選的兩個版本都不明確。 Apple的LLVM編譯器3.0編譯時沒有錯誤。
為什么gcc對我要調用哪個函數感到困惑? 我認為很明顯,通過用A::
限定a()
我要求函數的static
版本。 當然,如果我刪除static
函數a()
,這段代碼仍然無法編譯,因為A::a()
不是調用非static
a()
有效語法。
謝謝你的評論!
原因是名稱解析在編譯器執行任何其他操作之前發生,例如找出要使用的重載函數。
與修飾函數A::
只是告訴編譯器“看里面A
找到的名字a
”。 它實際上並沒有幫助您解決您所指的功能。
編輯
因此,當您鍵入A::a()
,首先編譯器會認為“在A
查找成員函數或可以使用operator()
成員”。
然后編譯器認為,“好吧,這里有兩個可能性,一個被引用? a()
或a(int c = 0)
,默認c=0
不確定。
如果你刪除了static關鍵字並調用了像obj.a()
這樣的函數,那么仍然會有歧義。
WRT LLVM的解析器
我會說它為你做了一些額外的工作,這不是標准所要求的,假設A::a()
是靜態的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.