簡體   English   中英

查找從屬限定名

[英]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即使聲明了,也不接受任何參數。 以下問題自提出。

  • 為什么一個版本可以編譯,而另一個版本不行?
  • C++ 標准中有這樣的規則嗎? “如果編譯器能夠證明沒有實例化可以是格式正確的,它可以(但不是必須)在沒有實例化的情況下診斷錯誤。”

我的理論如下(正確嗎?)。 template_func N::foo里面同時是一個限定名和一個從屬名。 依賴名稱的查找被推遲到模板的實例化。 查找名稱(如果成功)會導致將該名稱的使用與該名稱的聲明聯系起來。 但是這個過程包括兩個步驟(我們現在只考慮限定名稱,看起來像 function 調用):

  1. 在限定符的 scope 中查找名稱(在此示例中,這意味着命名空間N )。 這可能會找到多個名稱,因為函數可以重載。
  2. 檢查 arguments 是否可以傳遞給找到的名稱。 這包括找到一個最佳匹配,如果多個fooN中。 這樣, N::foo N::foo聲明相關聯。

實際上第一步可以在沒有實例化的情況下完成。 編譯器似乎會這樣做,如果沒有找到foo ,它會診斷錯誤(這是可選的)。 如果至少找到一個foo ,則無需進行進一步分析。

您的分析似乎是正確的,並且您的代碼格式不正確,不需要診斷,無論是否void foo(); 是否被注釋掉。

您正在尋找的標准部分是:

[temp.res.general]/6.1

該程序格式錯誤,不需要診斷,如果:

— 無法為模板生成有效的特化...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM