2012-09-04 91 views
2

Possible Duplicate:
Where and why do I have to put the 「template」 and 「typename」 keywords?爲指針產生遞歸模板

我想創建的模板,這需要T類型和參數N作爲參數和「給出」第N級的爲T(例如一個指針。如果T是int和N被2它應該給int**

到目前爲止我的代碼是:

template<class T,int N> 
struct ptr 
{ 
    typedef ptr<T*,N-1>::t t; 
}; 

template<class T> 
struct ptr<T,0> 
{ 
    typedef T t; 
}; 

int main() 
{ 
    ptr<int,3>::t a; //a should be int*** 
} 

但它給我這個編譯器錯誤:

source.cpp:6:11: error: need 'typename' before 'ptr<T*, (N - 1)>::t' because 'ptr<T*, (N - 1)>' is a dependent scope

這是什麼意思,它如何解決(如果它可能在C++中)?

回答

3

的錯誤意味着ptr<T*, (N - 1)>::t從屬名稱

在模板定義中使用的t的含義取決於模板參數,因此編譯器無法自動確定t是類型而不是對象。

要糾正這個錯誤,你必須給編譯器一個暗示,即做字面上的消息表明什麼:前綴,它typename

typedef typename ptr<T*,N-1>::t t; 
1
template<class T,int N> 
struct ptr 
{ 
    typedef typename ptr<T*,N-1>::t t; 
}; 

template<class T> 
struct ptr<T,0> 
{ 
    typedef T t; 
}; 

int main() 
{ 
    ptr<int,3>::t a; //a should be int*** 
} 

編譯器告訴tdependent name,所以使用前typenameptr<T*, (N - 1)>::t