2013-04-17 50 views
1

我有一個類Tran包含一個類Car的實例。如果程序包括typenametypedef之前,它會產生一個錯誤:「預計嵌套名稱 - 符typedef之前」。如果它不包含typename,則會在'Tran :: CarType :: Model'之前產生一個錯誤:「需要'typename',因爲'Tran :: CarType'是一個從屬範圍」。什麼導致了這個問題?在C++中產生typename和typedef相關錯誤的模板類?

#include "Car.hpp" 

template<typename A, typename B, typename C> 
class Tran { 

    public: 
    typedef Car<A, B> CarType; //compilation error 
    typedef CarType::Model M; //compilation error 

private: 
CarType myCar; 
} 

回答

4

的問題是這一行:

typedef CarType::Model M; 

這裏應注意,CarType被定義爲

typedef Car<A, B> CarType; 

注意CarType取決於什麼AB是。實際上,因爲這個原因,它被稱爲相關類型

在C++中,如果你想訪問嵌套一個依賴型的內部的類型,你必須明確地告訴你正在尋找一個依賴型的一些其他類型的名稱內的編譯器。因此,這條線是一個錯誤:

typedef CarType::Model M; 

因爲沒有跡象表明Model是一種類型的名稱。爲了解決這個問題,改變要讀取行

typedef typename CarType::Model M; 

在此,關鍵字typename指示C++該Model是嵌套依賴型CarType內的類型的名稱。

希望這會有所幫助!

+4

我應該猜到,這個問題是你的...... * template typedef * :) –

+0

@DavidRodríguez-dribeas-我在想,當我輸入這個。 :-) – templatetypedef

2

正確的順序是typedef typename,而不是周圍的其他方式。你只需要它在第二個聲明中,因爲它是一個獨立的名稱,編譯器在第一階段的查找過程中無法知道什麼是CarType::Model