Редактирование, так как я пока не могу оставлять комментарии (50 респ хех) ...
Филипп, отвечая на ваш комментарий сегодня утром, согласно стандарту, вы не можете частично специализировать члена классашаблон, вы можете только полностью специализировать их (будь то шаблон класса, функция, шаблон функции и т. д.).В первом примере вы полностью специализируете функцию-член foo.Во втором примере вы частично специализируете, причина, по которой он не будет компилироваться.Вы можете полностью специализировать его следующим образом:
template< >
inline int Test< int, 2 >::foo()
{...}
Хотя фрагмент кода Конрада является совершенно законным, я не уверен, что причина того, почему код Филиппа не компилируется, верна.(Хотя, как упоминал Конрад, вы не можете частично специализировать шаблон функции).
Проблема в коде Филиппа заключается в том, что мы объявляем шаблон класса, а не шаблон функции.Следовательно, объявление специализации шаблона частичного класса необходимо для того, чтобы определение частичной специализации было допустимым.
#include <cstdlib>
template< typename T, std::size_t Dim >
class Test
{
public:
int foo();
};
template < typename T >
class Test < T, 1 >
{
public:
int foo();
};
template< typename T, std::size_t Dim >
inline int Test< T, Dim >::foo()
{
return 0;
}
template< typename T >
inline int Test< T, 1 >::foo()
{
return 1;
}
int main()
{
Test< double, 2 > wTest2;
Test< int, 1 > wTest1;
wTest2.foo();
wTest1.foo();
return 0;
}