2017-04-01 467 views
0

以下代碼(包括在單個的頭文件)是我遇到問題的簡單的例子:不能編譯代碼[C++]

template <class T> 
class A 
{ 
public: 
    enum Type 
    { 
     ONE, 
     TWO 
    }; 

    A(Type tp = ONE):tp(tp) { 

    } 

protected: 
    Type tp; 
}; 

template <class T> 
class B : public A<T> 
{ 

    B(Type _tp):A<T>(_tp) { 

    } 

}; 

這將產生編譯錯誤(在鐺)

Untitled 2.cpp:24:4: error: unknown type name 'Type' 
     B(Type _tp):A<T>(_tp) { 
     ^
1 error generated. 

如果我代替移動枚舉的A範圍之外,或刪除的AB的模板化,則以上代碼編譯。

回答

2

如果你的枚舉會這麼簡單,那麼最好簡單地將它移動到A<T>之外,正如你已經指出的那樣 - 你可以將它保留在命名空間中,如果你願意的話。否則,枚舉在類A<T>內部,因此在B,Type內部的名稱不完整。相反,需要

template <class T> 
class B : public A<T> 
{ 

    B(typename A<T>::Type _tp) 
     : A<T>(_tp) 
    { 
    } 

}; 

typename關鍵字,因爲A是模板。

+0

[現場示例](https://wandbox.org/permlink/PVq6HACyZAuimAjp) – apmccartney

+0

非常感謝jwimberley –