VS2010 C ++ ошибка специализации функции шаблона члена - PullRequest
2 голосов
/ 13 июля 2010

У меня есть следующий (свернутый) код, который работал в 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 ]

7 голосов
/ 13 июля 2010

Обход

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; } 

}; 
4 голосов
/ 13 июля 2010

Это соответствует стандарту C ++ 14.7.3 / 18:

В явном объявлении специализации для элемента шаблона класса или шаблона элемента, который появляется в области пространства имен шаблон члена и некоторые из его вмещающих шаблонов классов могут оставаться неспециализированными, за исключением того, что объявление не должно явно специализировать шаблон члена класса, если его включающий класс шаблоны также не являются специализированными . <...>

Не разрешается специализироваться Spec без специализации TDataType.

...