2016-06-21 7 views
3

Ich versuche ein Merkmal zu schreiben, um zu erkennen, ob ein beliebiger Typ einen Insertionsoperator dafür definiert hat. Dazu möchte ich std :: is_same <> verwenden, um den Typ des Funktionszeigers mit dem erwarteten Typ zu vergleichen. Ich habe ein Problem mit dem folgenden Code ausgestelltDie Adresse des Operators << schlägt fehl in gcc 4.8

#include <iostream> 
class A {}; 
std::ostream& operator<<(std::ostream& os, const A& a) 
{ 
    return os; 
} 
int main() 
{ 
    decltype(static_cast<std::ostream&(*)(ostream&, const A&)>(&operator<<)) foo = nullptr; 
    std::cout << foo << std::endl; 
    return 0; 
} 

in gcc 4.8 mit --std = C++ 11

test2.cpp:12:81: error: expected primary-expression before ')' token 
    decltype(static_cast<std::ostream&(*)(std::ostream&, const A&)>(&::operator<<)) foo = nullptr; 
                       ^

Der Fehler nicht in Klirren erscheint oder neuere Versionen von gcc jedoch für Produktion müssen wir in der Lage sein, in gcc 4.8 zu kompilieren. Gibt es dafür einen Workaround in GCC 4.8?

Antwort

3

Sieht aus wie diese Version von GCC nicht korrekt analysiert.

using op_type = std::ostream&(*)(std::ostream&, const A&); 
decltype(static_cast<op_type>(&operator<<)) foo = nullptr; 

Live Demo

+2

Gedanke, dass das Problem könnte die gleiche gewesen sein, dies zu umgehen, können Sie einen Alias ​​für die Funktion Zeigertyp deklarieren wie http://stackoverflow.com/q/23061912/560648, aber es ist nicht, also weiß ich nicht, warum ich diesen Kommentar schreibe –

+0

Ich hatte angenommen, das Problem sei mit Operator << eher als der Zeigertyp. –

0

Statt ostream&, schreiben std::ostream&:

#include <iostream> 
class A {}; 
std::ostream& operator<<(std::ostream& os, const A& a) 
{ 
    return os; 
} 
int main() 
{ 
    decltype(static_cast<std::ostream&(*)(std::ostream&, const A&)>(&operator<<)) foo = nullptr; 
    std::cout << foo << std::endl; 
    return 0; 
} 
+0

Sieht aus wie [das ICEs GCC 4.8] (http://coliru.stacked-crooked.com/a/37c539ab386e56de). – TartanLlama