У меня есть шаблон класса с функцией-членом шаблона.Я хочу явно создать экземпляр класса, чтобы избежать резкого замедления компиляции.Я использую g ++ 4.1.2.Я получаю неоднозначные ошибки специализации шаблона от компилятора.Это самый короткий код, который воспроизведет проблему:
template <class T, class S >
class Test
{
public:
template< typename T1 >
void* get( const T1& );
void* get(const int& ); //Specialization of the above
};
typedef Test<int, double> foo;
//instantiate
inline template class Test<int, double>;
template void* foo::get(int const&);
Я не хочу использовать универсальный метод:
template class Test<int, double>
, поскольку перегрузка get (const int &) не будетбыть определено для всех возможных явных реализаций, и, следовательно, компилятор выберет соответствие для типов, которые его не поддерживают.
Этот код компилируется в Visual Studio (без встроенного предшествующего шаблона, который является специфическим расширением gcc).Может кто-нибудь пролить свет на то, как я получаю этот фрагмент кода для компиляции?
ОБНОВЛЕНИЕ: Это ошибка, которую я получаю:
g++ -c -o template.o template.cpp
template.cpp:14: error: ambiguous template specialization ‘get<>’ for ‘void* Test<int, double>::get(const int&)’
template.cpp:7: error: candidates are: void* Test<T, S>::get(const int&) [with T = int, S = double]
template.cpp:6: error: template<class T1> void* Test::get(const T1&) [with T1 = T1, T = int, S = double]
ОБНОВЛЕНИЕ2: Спасибо за решение, это нескомпилировать хотя.Специализации не разрешены внутри класса.Ошибка:
g++ -c -o template.o template.cpp
template.cpp:7: error: explicit specialization in non-namespace scope ‘class Test<T, S>’
template.cpp:7: error: enclosing class templates are not explicitly specialized
template.cpp:8: error: ‘get’ is not a template function
template.cpp: In instantiation of ‘void* Test<T, S>::get(const T1&) [with T1 = int, T = int, S = double]’:
template.cpp:15: instantiated from here
template.cpp:15: error: explicit instantiation of ‘void* Test<T, S>::get(const T1&) [with T1 = int, T = int, S = double]’ but no definition available
make: *** [template.o] Error 1