2017-11-14 3 views
3

Ich versuche, mein Projekt mit neuer GCC-Version 7.2.1 und habe ein Problem mit dynamischer Ausnahme Spezifikationen zu kompilieren:C++ 1z dynamische Ausnahmespezifikation Fehler

error: ISO C++1z does not allow dynamic exception specifications 
    MEMORY_ALLOC_OPERATORS(SQLException) 

Das Problem ist, dass diese Fehler aus Dritt kommen -Partei-Bibliotheken, die ich nicht kontrolliere.

Gibt es eine Möglichkeit, es zu beheben? Soweit ich weiß, kann ich dem Compiler nicht sagen, dass er Fehler durch Warnungen ersetzen soll. Die Verwendung von --std=c++14 ist keine Option, da ich neue Features von C++ 1z verwenden möchte.

+0

[Diese Frage] (https://stackoverflow.com/questions/13841559/deprecated-throw-list-in-c11) könnte auch für Ihre Frage nützlich sein. – Icemanind

Antwort

5

C++ 17 entfernte dynamische Ausnahme-Spezifikationen, als Ergebnis von P0003. Zuvor waren sie seit C++ 11 veraltet. Sie sind nicht mehr Teil der Sprache, also gibt es nicht wirklich eine Möglichkeit, sie zu beheben. Solange Sie diese Bibliothek von Drittanbietern benötigen, bis sie sich ändert, stecken Sie in C++ 14 fest.


Wenn Sie verzweifelt sind, könnten Sie versuchen:

#define throw(...) 

aber ich würde es nicht empfehlen.

+3

Vielleicht ist der beste Ansatz eine Isolationsschicht (kompiliert als C++ 14) über die Bibliothek, die eine C++ 17-Schnittstelle für das Programm verfügbar macht? –

0
  1. Isolationsschicht wie erwähnt, wie oben im Kommentar erwähnt. Etwas wie:

#if __cplusplus < 201703L // Standards below C++2017

void fn() throw (int) { } 

#endif // __cplusplus

  1. Es ist höchste Zeit u begann throw(whatever) mit noexcept(fasle) ersetzen.

Wie auch immer, seien Sie bereit für etwas Spaß!

0

lief in das gleiche Problem, so hatte ich diese Makrodefinition in /usr/include/cppconn/exception.h zu ändern:

#define MEMORY_ALLOC_OPERATORS(Class) \ 
void* operator new(size_t size) noexcept(false) { return ::operator new(size); } \ 
void* operator new(size_t, void*) noexcept; \ 
void* operator new(size_t, const std::nothrow_t&) noexcept; \ 
void* operator new[](size_t) noexcept(false); \ 
void* operator new[](size_t, void*) noexcept; \ 
void* operator new[](size_t, const std::nothrow_t&) noexcept; \ 
void* operator new(size_t N, std::allocator<Class>&);