Подтвердить что ты не робот

Операторы Double template <>

Существует такое определение функции:

template<>
template<>
void object::test<1>()
{
}

Что это значит, что есть двойной шаблон < > ?

EDIT:

Я извлек код, который действителен для этого примера:

#include <iostream>

template <class U>
class A {

    template <int n>
    void test() {

    }
};

template <class T>
class B {
public:
    typedef A<T> object;
};

typedef B<int>::object object;

template<>
template<>
void object::test < 1 > () {
}

int main() {
    return 0;
} 

Этот код компилируется под g++.

Источник: Тестовая среда TUT

4b9b3361

Ответ 1

Например,

template<class T = int> // Default T is int
class object<T> {
   template<int R> void test ();
};

Ваш код:

template<> // T is fixed
template<> // R is fixed
void object<>::test<1>() // T is default int, R is 1
{
}

эквивалентно:

template<> // T is fixed
template<> // R is fixed
void object<int>::test<1>() // T is int, R is 1
{ 
} 

Ответ 2

Это шаблонная специализация шаблона функции члена шаблона шаблона (я получил это правильно?) с параметром по умолчанию для шаблона. Посмотрите на это:

template<typename T = int>
struct X {
  template<typename U>
  void foo(U u);
};

template<>
template<>
void X::foo(float f) { }

Это вводит специализацию для случая, когда параметр шаблона X равен int, а аргумент X<int>::foo - float. Этот случай немного отличается от вашего, мы не должны предоставлять аргумент шаблона явно после имени функции-члена, как это может быть выведено. У вашей функции есть аргумент шаблона не-типа, который не может быть выведен и как таковой должен быть предоставлен.

Что меня больше смущает, так это аргумент шаблона по умолчанию, и я не уверен, что это хорошая практика для использования пропустить его. Я бы предоставил его для каждой специализации, чтобы избежать путаницы.

Ответ 3

Это выглядит как специализация шаблона функции в шаблоне класса. Например, рассмотрим следующее определение шаблона класса:

template <int m=1>
class object
{
public:
  template <int n>
  void test();
};

// This differs from your example, by the addition of `<>` after `object`, but it as
// close as I can come to valid code true to your example
template<> 
template<> 
void object<>::test<1>() 
{ 
}