Невозможно сопоставить определение функции, если тип в шаблоне концепции имеет псевдоним ⇐ C++

Программы на C++. Форум разработчиков
Anonymous
Невозможно сопоставить определение функции, если тип в шаблоне концепции имеет псевдоним

Сообщение Anonymous »

Мне кажется, я нашел ошибку в MSVC, но хотел бы подтвердить. У меня есть следующий простой воспроизводитель:

Код: Выделить всё

template 
concept convertible_range =
std::ranges::sized_range && std::convertible_to;

template 
struct S {
using value_type = T;
template 
void foo(R&&);
};

template 
template 
void S::foo(R&&) {}
Это компилируется с помощью gcc-14.1, но не выполняется во всех версиях MSVC++ с:

ошибкой C2244: 'S: :foo': невозможно сопоставить определение функции с существующим объявлением

Реальный пример
Похоже, проблема в том, что комбинация определения foo вне класса с использованием псевдонима типа в объявлении foo в S. Если я либо:
  • определю функцию на месте:

Код: Выделить всё

struct S {
using value_type = T;
template 
void foo(R&&) {}
};
  • Измените объявление, чтобы использовать T напрямую:

Код: Выделить всё

template 
struct S {
template  // Difference is here!
void foo(R&&);
};

template 
template 
void S::foo(R&&) {}
Затем это компилируется.
Это ошибка MSVC?

Подробнее здесь: https://stackoverflow.com/questions/791 ... is-aliased

Вернуться в «C++»