Как определить специализацию шаблона для шаблонной функции для шаблонного класса - PullRequest
0 голосов
/ 23 мая 2018

У меня есть класс, что-то вроде BizClass ниже.Я хотел бы определить шаблонную функцию и специализацию для конкретного конкретного типа.Я не уверен в правильности синтаксиса.

template <class Foo> 
class BizClass {
 public:
  template <typename Bar>
  void Action(Container<Bar> m);
  // Foo is used somewhere else...
};

// This seems to work.
template <class Foo>
template <typename Bar>
inline void BizClass<Foo>::Action(Container<Bar> m) {}

// This specialization doesn't compile, where Foobar is a concrete class.
template <class Foo>
inline void BizClass<Foo>::Action(Container<FooBar> m) {}

Как мне обработать специализацию шаблона для этого случая?

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

В вашем первом примере кода с именем This seems to work., который просто определяет тело для функции шаблона, это не специализация.

Во втором примере вы пытаетесь специализировать шаблон, который является членомдругого неспециализированного шаблона.Это недопустимо.

Вам также необходимо указать BizClass, если вы хотите специализировать Action, например, вот пример с Foo=int и Bar=char:

template<> template<>
inline void BizClass<int>::Action(Container<char> m)
{

}
0 голосов
/ 23 мая 2018

Как мне обработать специализацию шаблона для этого случая?

Насколько я знаю, C ++ запрещает специализацию метода внутри структуры / класса шаблона, не специализируя структуру/ Сам класс.

Но вы можете использовать перегрузку: сделать Action (Container<FooBar> m) не шаблонным методом

#include <iostream>

template <typename>
struct Container
 { };

struct FooBar
 { };

template <typename Foo> 
struct BizClass
 {
   template <typename Bar>
   void Action (Container<Bar> m);

   void Action (Container<FooBar> m);
 };

template <typename Foo>
template <typename Bar>
inline void BizClass<Foo>::Action (Container<Bar> m)
 { std::cout << "Action() generic version" << std::endl; }

template <typename Foo>
inline void BizClass<Foo>::Action (Container<FooBar> m)
 { std::cout << "Action() FooBar version" << std::endl; }

int main ()
 {
   BizClass<int>  bci;

   bci.Action(Container<int>{});     // print Action() generic version
   bci.Action(Container<FooBar>{});  // print Action() FooBar version
 }
...