我有以下(最小化)代码,该代码在VC2005中有效,但在2010年不再有效。
template <typename TDataType>
class TSpecWrapper
{
public:
typedef typename TDataType::parent_type index_type;
public:
template <bool THasTriangles>
void Spec(index_type& io_index)
{ std::cout << "False version" << std::endl; }
template <>
void Spec<true>(index_type& io_index)
{ std::cout << "True version" << std::endl; }
};
似乎当“index_type”是一个依赖类型时,我总是在特化上得到一个C2770:无效的显式模板参数错误。请注意,此代码实际上足以生成错误 - 空的main足以编译它,模板甚至不需要实例化。
如果index_type不是依赖类型,它可以正常工作。任何想法为什么在VC2010中如此,如果这实际上是标准行为或错误,如果我可以解决它?
答案 0 :(得分:7)
解决方法
template <bool v> struct Bool2Type { static const bool value = v; };
template <typename TDataType>
class TSpecWrapper
{
public:
typedef typename TDataType::parent_type index_type;
public:
template <bool THasTriangles>
void Spec(index_type& io_index)
{
return SpecHelp(io_index, Bool2Type<THasTriangles>());
}
private:
void SpecHelp(index_type& io_index, Bool2Type<false>)
{ std::cout << "False version" << std::endl; }
void SpecHelp(index_type& io_index, Bool2Type<true>)
{ std::cout << "True version" << std::endl; }
};
答案 1 :(得分:4)
这符合C ++标准14.7.3 / 18:
在显示的类模板成员或成员模板的显式特化声明中 在命名空间作用域中,成员模板及其一些封闭的类模板可能仍然未经专门化, 除了声明不应该明确地专门化类成员模板(如果它的封闭类) 模板也没有明确专门化。 &LT; ...&GT;
如果不专门设置Spec
,则不允许专门化TDataType
。