2011-04-02 97 views
7

我有下面的代碼有問題:模板的typedef類中不起作用

template <typename U> 
class lamePtr 
{ 
public: 
    typedef U* ptr; 
}; 

template <typename U> 
class smarterPointer 
{ 
    public: 
    void funFun() 
    { 
     typedef lamePtr<U> someType; 
     someType::ptr query; 
    } 
}; 

正如你看到的,我有內部lamePtr一個typedef。在smarterPointer類中,我有一個函數funFun()。我想要做的是做另一個typedef someType。直到那條線,一切工作正常,直到我們到一些類型:: ptr查詢行。

我想在這裏發生的是「查詢」將變成lamePtr < U> :: ptr(一個簡單的值,而不是一個typedef;)。但是,我得到彙編錯誤(與海灣合作委員會4.4.3):

temp.cpp: In member function ‘void smarterPointer&ltU>::funFun()’: 
temp.cpp:15: error: expected ‘;’ before ‘query’

我在做什麼錯在這裏?

+0

相關,有很多關於爲什麼需要'typename'的信息:[我在哪裏以及爲什麼必須將'template'和'typename'放在依賴名稱上?](http://stackoverflow.com/questions/610245/where-and-why-do-i-have-to-put-template-and-typename-on-dependent-names) – 2011-04-02 17:40:28

+1

將來,不要嘗試用html標籤格式化你的代碼。只需按原樣輸入,全部選中,然後單擊「{}」按鈕。 – 2011-04-02 17:44:18

+0

謝謝,我將在未來記住這一點。感謝參考詹姆斯,我會花一些時間在那 – Melon 2011-04-02 18:16:26

回答

12

someType,因爲lamePtr<U>是「依賴名稱」。這取決於U是否存在成員ptr以及如果是,該成員是什麼類型的「事情」。

當然,知道,所有TlamePtr<T>::ptr是一種類型,但在這個階段編制的解析器不知道。使用the typename keyword來向解析器暗示它是一種類型其餘部分將在編譯過程中稍後解決。只是一個小小的C++怪癖。

template <typename U> 
class lamePtr 
{ 
public: 
    typedef U* ptr; 
}; 

template <typename U> 
class smarterPointer 
{ 
    public: 
    void funFun() 
    { 
     typedef lamePtr<U> someType; 
     typename someType::ptr query; 
    } 
}; 
+0

像魅力[; – Melon 2011-04-02 18:15:45

+0

@Melon:沒問題:) – 2011-04-02 18:17:20

9

您需要typename關鍵字來表示someType::ptr是一種類型。

typename someType::ptr query; 

查看Officially, what is typename for?瞭解詳情。

+0

謝謝,這工作。我一定要閱讀更多關於typenames的信息,感謝解決方案和鏈接 – Melon 2011-04-02 18:15:30

+0

@Melon:如果你感興趣的話,可以閱讀一些進一步的閱讀材料:http://www.comeaucomputing.com/techtalk/templates/#typename – ildjarn 2011-04-02 19:28:52