Я пытаюсь специализировать функцию-член шаблона нешаблонного класса, используя шаблонный параметр:
#include <array>
class C
{
public:
template<class Container>
void Foo( Container& )
{
// ...
}
};
template<class T, std::size_t N>
template<>
void C::Foo< std::tr1::array<T,N> >( std::tr1::array<T,N>& )
{
// special
}
Я получаю сообщение об ошибке "недопустимое использование явных аргументов шаблона". Каков правильный синтаксис, чтобы сделать это действительным?
Обновление:
Возможно, я запутал проблему чрезмерным упрощением. Что я действительно хочу сделать, так это специально обработать этот случай, когда задействовано зависимое имя, что, как я думаю, может быть причиной того, что здесь мы бросаем гаечный ключ в работу. Моя первоначальная мысль заключалась в том, чтобы перегрузить функцию как таковую:
class C
{
public:
template<class Iter>
void Foo( Iter )
{
std::cout << "Normal\n";
}
template<class T, std::size_t N>
void Foo( typename std::tr1::array<T,N>::iterator )
{
std::cout << "Special\n";
}
};
int main()
{
C c;
std::tr1::array<int,10> a1;
c.Foo( a1.begin() ); // Doesn't print "Special"!
}
Но специальный Foo не вызывается. Как я могу это сделать?