Вне класса определение шаблона функции-члена при наличии одноименной функции-члена - расхождение компилятора - PullRequest
4 голосов
/ 29 мая 2019

Рассмотрим этот пример шаблона класса, содержащего функцию-член и шаблон функции-члена, оба из которых названы f с последующей попыткой определить и специализировать шаблон функции-члена:

template<typename T>
struct A {
    void f();
    template<typename U>
    void f();
};

template<>
template<typename U>
void A<double>::f() { }

template<>
template<>
void A<double>::f<int>() { }

Isэто законно?Как записать определение шаблона функции-члена?

В первом определении f объявление шаблона гарантирует, что шаблон функции-члена f должен быть выбран, а не функция-член f дажехотя параметр шаблона не отображается в типе?Я не вижу способа дальнейшего устранения этой неоднозначности, поскольку написание ::template f(), ::f<U>(), ::f<>() или их комбинации, похоже, не помогает.

Результаты компилятора:

  • clang: сбой с трассировкой стека по специализации f<int>
  • Visual Studio: успешная компиляция
  • gcc: ошибка компиляции (неопределенность относительно определения f) впервое определение f
  • EDG: компилируется успешно

В отличие от этого, каждый компилятор принимает эквивалент в области имен пространства:

namespace X {
    void f();
    template<typename T>
    void f();
}
template<typename T>
void X::f() { }
template<>
void X::f<int>() { }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...