2016-05-05 23 views
-1

Dies scheint ein Visual Studio-Problem zu sein. Dieser Code runs fine in gcc aber nicht in Visual Studio kompilieren:Warum kann ich den Bool-Wert nicht von einem Werttyp abrufen, der von decltype zurückgegeben wird?

#include <iostream> 
#include <type_traits> 
#include <typeinfo> 

using namespace std; 

true_type foo(); 

template <typename T> 
struct bar{ 
    using def = conditional_t<decltype(foo())::value, char, void>; 
}; 

int main() { 
    cout << typeid(bar<int>::def).name() << endl; 

    cout << decltype(foo())::value << endl; 
} 

Der Fehler gegeben ist:

syntax error: missing '>' before identifier 'value'

Sie können testen, online unter: http://webcompiler.cloudapp.net/

Gibt es einen Bug-Fix für dieses oder ein Problemumgehung?

+0

Welchen Compiler benutzen Sie? (scheint an [gcc 6.1] zu arbeiten (http://coliru.stacked-crooked.com/a/69fbf1c430cf3e1a)) – milleniumbug

+0

@milleniumbug Leider bin ich auf Visual Studio, das scheint einen Fehler zu haben :( –

+0

@NathanOliver I ' habe bearbeitet, das ist kein Tippfehler, bitte erneut öffnen –

Antwort

1

Ich bin mir nicht sicher, ob es Ihnen helfen kann, aber ich bin in der Lage, wie diese, um das Problem zu umgehen:

Zuerst definieren:

template <typename I> using id = I; 

ersetzen dann jede Instanz decltype(foo())::value mit

id<decltype(foo())>::value 

Alternativ können Sie std::common_type_t die gleiche Art und Weise verwenden:

Oder meine psychischen Kräfte vorhersagen möchten Sie vielleicht nur einen separaten Typ definieren für decltype<foo()>, für die Bequemlichkeit:

using id = decltype(foo());

dann alle Instanzen decltype(foo())::value mit id::value ersetzen.

2

In Ihrer Frage, die Sie verwenden decltype(foo()):

using def = conditional_t<decltype(foo())::value, char, void>; 
            ^^^^^ 

während auf Ideone, decltype(foo):

using def = conditional_t<decltype(foo)::value, char, void>; 
            ^^^^^ 

Sie verschiedene Dinge sind. Im ersten Fall erhalten Sie den Typ das Ergebnis des Aufrufs foo. In der zweiten Version erhalten Sie den Typ einer Funktion selbst.


Okay, seit dieser Zeit haben sich die Dinge dramatisch verändert.

Der Code wurde bearbeitet und sollte gut kompilieren, aber Kompilationen mit Visual Studio scheiterten, während clang sehr glücklich mit diesem Code war und keine Fehler und sogar Warnungen zeigte.

Also, angesichts der Clang (die neueste Version, mit --std=c++14 -Wall -Wextra) findet diesen Code richtig, ich glaube, das sollte ein Fehler in VS sein.

+0

Ich habe bearbeitet, das ist kein Tippfehler, bitte erneut öffnen. –

+0

@ JonathanMee, dies kompiliert gut mit C++ 14 Standard. Obwohl ich nicht weiß, wie wir Standards in VS ändern ... – ForceBru

+0

Haben Sie den Code versucht, den ich in Visual Studio 2015 veröffentlicht habe? Ich habe einen Link zu Microsofts Web Compiler gepostet. Es kompiliert nicht gut. –