VS2010 C ++成员模板函数特化错误

时间:2010-07-13 10:27:40

标签: c++ visual-studio-2010 templates specialization

我有以下(最小化)代码,该代码在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中如此,如果这实际上是标准行为或错误,如果我可以解决它?

2 个答案:

答案 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