Обнаружить существование имени хотя бы в одном базовом классеC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Обнаружить существование имени хотя бы в одном базовом классе

Сообщение Anonymous »

Этот код (сокращенный из кодовой базы Chromium) принят Clang, но отклонен GCC:

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

template concept Concept = requires {typename T::marker;};
#define INJECT_MARKER using marker = int;
struct Base1{
INJECT_MARKER
};
struct Base2{
INJECT_MARKER
};

struct Derived: Base1,  Base2{};

static_assert(Concept);

GCC завершает работу со следующей ошибкой:

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

:12:15: error: static assertion failed
12 | static_assert(Concept);
|               ^~~~~~~~~~~~~~~~
• constraints not satisfied
• required by the constraints of 'template concept Concept'
:1:27:
1 | template concept Concept = requires {typename T::marker;};
|                           ^~~~~~~
• in requirements  [with T = Derived]
:1:37:
1 | template concept Concept = requires {typename T::marker;};
|                                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
• the required type 'typename T::marker' is invalid, because
:1:56:
1 | template concept Concept = requires {typename T::marker;};
|                                               ~~~~~~~~~^~~~~~~~~~
• error: lookup of 'marker' in 'Derived' is ambiguous
• candidates are: 'using Base2::marker = int'
:2:29:
2 | #define INJECT_MARKER using marker = int;
|                             ^~~~~~
• in expansion of macro 'INJECT_MARKER'
7 |         INJECT_MARKER
|         ^~~~~~~~~~~~~
•                 'using Base1::marker = int'
:2:29:
2 | #define INJECT_MARKER using marker = int;
|                             ^~~~~~
• in expansion of macro 'INJECT_MARKER'
4 |         INJECT_MARKER
|         ^~~~~~~~~~~~~
Compiler returned: 1
В Chromium существуют десятки экземпляров этого макроса. Я не могу изменить иерархию наследования, которая может включать несколько уровней (мы должны поддерживать обнаружение косвенных оснований).
Я могу изменить макрос INJECT_MARKER и концепцию.
Помогите мне выполнить рефакторинг, чтобы код компилировался с помощью GCC.>

Подробнее здесь: https://stackoverflow.com/questions/798 ... base-class
Ответить

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

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

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

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

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