Qubc
@Qubc
Ненавижу полисемию.

Почему при определении шаблона функции, принадлежащего шаблону класса, не нужно указывать шаблонный тип?

template <typename T>
class A {
    T data;
public:
    template <typename C>
    void func (C c);
};

template <typename T> template <typename C>
void A<T>::func (C c) { // non-type partial specialization 'func<C>' is not allowed, причём здесь частичная специализация?
}

int main() {
    A<int>().func<int>(1);
    A<long>().func<char>('1');
    return 0;
}
  • Вопрос задан
  • 124 просмотра
Пригласить эксперта
Ответы на вопрос 1
@code_panik
// non-type partial specialization 'func' is not allowed

Буквально значит, что язык позволяет определить частичную специализацию только для пользовательского типа. Частичная специализация функции запрещена.
Общий вид частичной специализации можно посмотреть здесь. Видно, что в определениях есть непустые угловые скобки после template и после имени, как и в примере из вопроса.
Значит, скобки после имени функции в определении не нужны, если это не полная специализация. И в полной специализации скобки опускают, если тип выводится из типов аргументов (пример).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы