Невозможно сопоставить определение функции, если тип в шаблоне концепции имеет псевдоним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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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