2017-07-07 83 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