2010-09-24 25 views
4

考慮下面的程序:不合格查找和(maybe-)依賴性基類

template <typename T> 
struct t 
{ 
    struct base { void f1(); }; 
    struct derived : base 
    { 
     void f2() 
     { 
      f1(); 
     } 
    }; 
}; 

derived::f2,不合格查找用於查找f1。將會搜索base?將會找到base::f1base是依賴類型嗎?

請用標準引用來證實您的答案。

回答

7

是的,base是相關的,所以找不到f1。在C++ 03中,這被addition14.6.1/2d(其在C++ 98中不存在)以及在C++ 0x中被清除,這直接由14.6.2.1/6(n3126)表示。

的依賴IT是很重要的,因爲下面是可能

// for T = int, f1 does not exist. 
template<> struct t<int>::base { }; 
+0

啊,那是我錯過的石頭,我忘記了只專門化模板類型的子類的可能性。 – 2010-09-24 14:19:18

+0

謝謝,14.6.1/2d正是我所期待的! – avakar 2010-09-24 14:22:53

+0

@Matthieu我不明白你的問題。 – 2010-09-24 16:07:50

0

這不適合評論中...

GCC拒絕代碼:

there are no arguments to 'f1' that depend on a template parameter, so a declaration of 'f1' must be available

但是,在f1之前引入this->使其依賴,然後編譯工作。

至於我的經驗表明,同樣的行爲適用於:

  • 類型(你必須typedef他們再次)
  • 方法(你需要使用using base::f1this->f1

而我看到過這種行爲:

  • GCC 3.4
  • VC++ 9
  • VC++ 10

現在我們可以等待standardistas擺脫標準的確切報價。

+1

感謝您的回答!實際上,在'f1'之前引入'this->'使得搜索使用成員名稱查找而不是非限定查找,因此找到了名稱。我在問,因爲我試圖用clang編譯我們的代碼庫,並且它在一些可以簡化爲問題示例(而MSVC和顯然gcc-4.3接受它)的東西上失敗了。 – avakar 2010-09-24 14:28:50

+0

MSVC沒有正確地實現模板支持(它沒有實現標準強制執行的兩階段查找)。我將用gcc-4.3進行測試 - >它已被接受(gcc-4.3.2)我不知道它是否已經被解決了。 – 2010-09-24 15:48:20

+0

@avakar:我很高興看到很多人對Clang感興趣。我是我自己,我真的認爲它可以隨着時間(和努力)成爲一個偉大的編譯器。 – 2010-09-24 15:53:15