Здравствуйте, 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>();
}