Компилятор Clang не может найти определение шаблона, введенное с помощью объявления using. gcc и msvc не видят проблемC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Компилятор Clang не может найти определение шаблона, введенное с помощью объявления using. gcc и msvc не видят проблем

Сообщение Anonymous »

Я столкнулся с ситуацией, когда gcc и clang имеют разные мнения по поводу одного и того же фрагмента кода. Насколько я понимаю, использование объявлений и встроенных пространств имен clang неверны.
Пример ниже работает так, как задумано, с gcc 14.2 и msvc v19.40, но clang 19 выдает непредвиденную ошибку в помеченной строке. (2). Поэтому я хотел бы спросить языковых юристов: хорошо ли сформулирован приведенный ниже пример и должен ли он быть принят также и clang.
Код (ссылка на godbolt) :

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

// Goal of this study:
//    - allow access to `Data` via public namespace lib::api.
//    - forbid access to `Data` via private namespace lib::impl_v1.

namespace lib::impl_v1 {
template 
struct Data;
} // namespace lib::impl_v1

namespace lib::api {
using impl_v1::Data;
} // namespace lib::api

namespace lib::impl_v1 {
inline namespace please_access_this_symbol_through_lib_api_namespace {
template  struct Data;                 // (1)
} // inline namespace please_access_this_symbol_through_lib_api_namespace
} // namespace lib::impl_v1

namespace lib::impl_v1 {
template 
struct Data
{
};
} // namespace lib::impl_v1

int main()
{
lib::api::Data       x;      // (2) clang error: implicit instantiation of undefined template 'lib::impl_v1::Data'
//    lib::impl_v1::Data   y;    // (3) The goal is to get error at this line: reference to 'Data' is ambiguous
return 0;
}
Играя с этим кодом, я обнаружил, что ошибка clang в строке (2) исчезает, если я закомментирую строку с пометкой (1). Но это сводит на нет весь смысл этого трюка, поэтому, очевидно, мне хотелось бы оставить строку (1).
Ошибка в строке (3) намеренно.

Подробнее здесь: https://stackoverflow.com/questions/790 ... ing-declar
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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