2017-07-07 82 views
0

我是C++中的新手,我試着編寫一個包含char或int類型的附加模板。之後,我想在其他模板中使用此模板來選擇數據類型,具體取決於輸入數據填充。在模板專精中使用typedef

template <bool isPadding> 
class PaddingTemplate; 

template <> 
class PaddingTemplate<false> 
{ 
public: 
    typedef char Type; 
}; 

template <> 
class PaddingTemplate<true> 
{ 
public: 
    typedef int Type; 
}; 

template <class T, bool Padding = ((sizeof(T) % sizeof(int)) == 0)> 
class ObjectComparator 
{ 
private: 
    typedef  PaddingTemplate<Padding> PaddingTrick; 
    typename PaddingTrick::Type   DataType; 

    DataType Shadow[sizeof(T)/sizeof(DataType)]; 
}; 

我得到這個編譯器錯誤

Compiler msg

如何解決這個問題,並自動根據數據填充數據類型的選擇?

回答

4

DataType實際上不是一種類型。這是PaddingTrick::Type的一個實例,這就是爲什麼下一行會給你一個錯誤。你需要做的:

typedef typename PaddingTrick::Type DataType; 
+0

非常感謝你!有效!你能解釋一下typename和typedef的組合是如何在這段代碼中起作用的嗎? – Ilia

+1

@Ilia,所有'typename'的意思是你所尋找的依賴名稱是一個類型:它可能是一個值,甚至是一個模板。如果你使用'typename Class :: type data',這意味着你想要構造一個這種類型的對象。 'typedef typename Class :: type type'表示你想要一個別名。 至於爲什麼需要'typename',這是一個很好的答案: https://stackoverflow.com/a/8584507/4131059 –

+0

什麼是酷編程語言С++!再次感謝和來自俄羅斯的大問候! – Ilia