[英]Lookup of dependent qualified names
該程序無法編譯( error: 'foo' is not a member of 'N'
):
namespace N {
// void foo();
}
template<class T>
void template_func(T t) {
N::foo(t);
}
但是,如果我們取消注釋void foo();
,它編譯。 演示。
兩個版本都有錯誤。 foo
即使聲明了,也不接受任何參數。 以下問題自提出。
我的理論如下(正確嗎?)。 在template_func
N::foo
里面同時是一個限定名和一個從屬名。 依賴名稱的查找被推遲到模板的實例化。 查找名稱(如果成功)會導致將該名稱的使用與該名稱的聲明聯系起來。 但是這個過程包括兩個步驟(我們現在只考慮限定名稱,看起來像 function 調用):
N
)。 這可能會找到多個名稱,因為函數可以重載。foo
在N
中。 這樣, N::foo
N::foo
聲明相關聯。 實際上第一步可以在沒有實例化的情況下完成。 編譯器似乎會這樣做,如果沒有找到foo
,它會診斷錯誤(這是可選的)。 如果至少找到一個foo
,則無需進行進一步分析。
您的分析似乎是正確的,並且您的代碼格式不正確,不需要診斷,無論是否void foo();
是否被注釋掉。
您正在尋找的標准部分是:
[temp.res.general]/6.1
該程序格式錯誤,不需要診斷,如果:
— 無法為模板生成有效的特化...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.