Информация об изменениях

Сообщение Re: Специализация метода. Нужно устранить ошибку от 24.08.2022 8:19

Изменено 24.08.2022 8:23 rg45

Re: Специализация метода. Нужно устранить ошибку
Здравствуйте, SVV, Вы писали:

SVV>Всем привет, есть такой код:

  Исходный пример
SVV>
SVV>using namespace std;
SVV>using u1 = unsigned char;

SVV>template<typename T>struct TypeH;
SVV>using TypeH1 = TypeH<int>;
SVV>using TypeH2 = TypeH<char>;

SVV>template<typename T>
SVV>struct STest4
SVV>{
SVV>  template<typename H> void foo();// ключевой момент
SVV>  template<> void foo<TypeH1>(){ cout << "TypeH1" << endl; }
SVV>};
SVV>//template<>
SVV>template<typename T> void STest4<T>::foo<TypeH2>(){ cout << "TypeH2" << endl; }//error C2768: 'STest4<T>::foo': illegal use of explicit template arguments

SVV>int Test4()
SVV>{
SVV>  STest4<float> st4;
SVV>  st4.foo<TypeH1>();
SVV>  st4.foo<TypeH2>();
SVV>  return 0;
SVV>}
SVV>

SVV>как правильно написать специализацию метода?

Здесь уже упомянули, что частичная специализация для функций не поддерживается. Но в таких случая обычно не составляет особого труда перейти от специализаций к перегрузкам. Примерно так:

http://coliru.stacked-crooked.com/a/9ff8360b3fef1f76

#include <iostream>

using u1 = unsigned char;

template<typename T>struct TypeH;
using TypeH1 = TypeH<int>;
using TypeH2 = TypeH<char>;

template <typename>
struct TypeHolder{};

template<typename T>
struct STest4
{
  template<typename H> void foo() { foo(TypeHolder<H>{}); }// ключевой момент
  void foo(TypeHolder<TypeH1>){ std::cout << "TypeH1" << std::endl; }
  void foo(TypeHolder<TypeH2>){ std::cout << "TypeH2" << std::endl; }
};

int main()
{
  STest4<float> st4;
  st4.foo<TypeH1>();
  st4.foo<TypeH2>();
}
Re: Специализация метода. Нужно устранить ошибку
Здравствуйте, SVV, Вы писали:

SVV>Всем привет, есть такой код:

  Исходный пример
SVV>
SVV>using namespace std;
SVV>using u1 = unsigned char;

SVV>template<typename T>struct TypeH;
SVV>using TypeH1 = TypeH<int>;
SVV>using TypeH2 = TypeH<char>;

SVV>template<typename T>
SVV>struct STest4
SVV>{
SVV>  template<typename H> void foo();// ключевой момент
SVV>  template<> void foo<TypeH1>(){ cout << "TypeH1" << endl; }
SVV>};
SVV>//template<>
SVV>template<typename T> void STest4<T>::foo<TypeH2>(){ cout << "TypeH2" << endl; }//error C2768: 'STest4<T>::foo': illegal use of explicit template arguments

SVV>int Test4()
SVV>{
SVV>  STest4<float> st4;
SVV>  st4.foo<TypeH1>();
SVV>  st4.foo<TypeH2>();
SVV>  return 0;
SVV>}
SVV>

SVV>как правильно написать специализацию метода?

Здесь уже упомянули, что частичная специализация для функций не поддерживается. Но в таких случая обычно не составляет особого труда перейти от специализаций к перегрузкам. Обрати внимание, использование остается именно таким, как в исходном примере, меняется только сама реализация полиморфизма. Примерно так:

http://coliru.stacked-crooked.com/a/9ff8360b3fef1f76

#include <iostream>

using u1 = unsigned char;

template<typename T>struct TypeH;
using TypeH1 = TypeH<int>;
using TypeH2 = TypeH<char>;

template <typename>
struct TypeHolder{};

template<typename T>
struct STest4
{
  template<typename H> void foo() { foo(TypeHolder<H>{}); }// ключевой момент
  void foo(TypeHolder<TypeH1>){ std::cout << "TypeH1" << std::endl; }
  void foo(TypeHolder<TypeH2>){ std::cout << "TypeH2" << std::endl; }
};

int main()
{
  STest4<float> st4;
  st4.foo<TypeH1>();
  st4.foo<TypeH2>();
}