Erkennen Sie das Vorhandensein eines Namens in mindestens einer BasisklasseC++

Programme in C++. Entwicklerforum
Anonymous
 Erkennen Sie das Vorhandensein eines Namens in mindestens einer Basisklasse

Post by Anonymous »

Dieser Code (aus der Chromium-Codebasis reduziert) wird von Clang akzeptiert, aber von GCC abgelehnt:

Code: Select all

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 schlägt mit dem folgenden Fehler fehl:

Code: Select all

: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
Es gibt Dutzende Instanzen dieses Makros in Chromium. Ich kann die Vererbungshierarchie nicht ändern, die mehrere Ebenen umfassen kann (wir müssen die Erkennung indirekter Basen unterstützen).
Ich kann das Makro und Konzept INJECT_MARKER ändern.
Helfen Sie mir, dies umzugestalten, damit der Code mit GCC erstellt wird.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post