2013-04-29 87 views
2

我想要通過從一個類或另一個類派生類來啓用或禁用某些類的某些功能。一切工作正常,直到我介紹另一個層次的間接導出條件。模板類的靜態成員初始化

例子:

template<bool EnableB> 
struct Traits1 
{ 
    static const bool BEnabled = EnableB; 
}; 

template<bool EnableB> 
struct Traits2 
{ 
    static const bool BEnabled; 
}; 

template<bool EnableB> 
const bool Traits2<EnableB>::BEnabled = EnableB; 

struct A{}; 
struct B : public A{}; 

template<typename Traits> 
struct C : public std::conditional<Traits::BEnabled, B, A>::type 
{ 
}; 


int main() 
{ 
    C<Traits1<true>> c1; //OK 
    C<Traits2<true>> c2; //error C2975: '_Test' : invalid template argument for 'std::tr1::conditional', expected compile-time constant expression 
} 

我不會有任何問題,我的初始化裏面Traits類,但只有整數類型可以內部類進行初始化...

能否請您解釋一下爲什麼這個問題似乎?是我的編譯器(VS2010)的問題,或者這是正常的行爲?

+0

'bool'被認爲是一個整體類型。你意識到你正在初始化一個bool而不是在另一個初始化它?錯誤信息也指向一個不在問題中的類型......爲什麼不發佈給你錯誤的確切代碼,或者**在一個更小的例子中重現**它並使用它? – 2013-04-29 12:45:57

+0

@DavidRodríguez-dribeas爲什麼選擇downvote?在Traits2中,我在課堂外初始化BEnabled。這在C++中對於整型是合法的。此外,錯誤消息是爲這個例子,_Test是從std ::條件。請閱讀代碼並在downvote之前對其進行測試... – Felics 2013-04-29 12:54:26

+0

在C++中初始化類的內部或外部是有效的,但第一個創建編譯時間常量,另一個不需要。初始化的註釋是用於*,但只有整型可以在類內初始化。*這是真實的,但是是一個限制,不適用於您的示例。 – 2013-04-29 13:10:28

回答

0

它似乎使用GCC 4.7(在Mac OS上)正常工作。我將要解決它是一個編譯器的缺點。如果你願意,也許可以在Windows上試用GCC。