我有一個帶模板成員函數的模板類。我想明確地實例化這個類,以避免劇烈的編譯放緩。我正在使用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特定的擴展)。有人可以告訴我如何讓這段代碼片段編譯?
UPDATE: 這是我的錯誤:
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]
UPDATE2: 感謝您的解決方案,它不雖然編譯。專業課不允許在課堂上進行。錯誤是:
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
'foo'是爲了'Test'嗎?你能發佈實際的錯誤和它所指的行嗎? – 2010-08-28 07:14:09
我鍵入foo以方便打字。實際的錯誤是: g ++ -c -o template.o template.cpp template.cpp:14:error:ambiguous template specialization'get <>'for'void * Test :: get(const int&)' template .cpp:7:error:candidate are:void * Test :: get(const int&)[with T = int,S = double] template.cpp:6:error:template void * Test :: get(const T1&)[與T1 = T1,T = INT,S =雙倍] –
Venkatesan
2010-08-28 07:23:48
糟糕,我沒有看到'typedef',對不起。 – 2010-08-28 07:26:06