2015-10-27 12 views
5

Ich bin mit dem MSVC2013 64-Bit-Compiler unter Windows 10.Armadillo Initialisiererliste funktioniert nicht

Nach:

std::cout << arma::arma_version::as_string() << std::endl; 

Ich habe Version 6.100.1 (Midnight Blue) der Armadillio Bibliothek.

Ich habe C++ 11 aktiviert, zum Beispiel

auto il = { 10, 20, 30 }; 
for(auto ele : il) 
    cout<<ele<<endl; 

arbeitet. Auch die Bibliothek korrekt hinzugefügt, wie der folgende Code ausgeführt:

vec v; 
v<<10<<20<<30; 
cout<<v; 

Doch der Versuch, initializer Listen zu verwenden für Armadillio ausfällt.

vec v = { 1.0, 2.0, 3.0 }; 

bewirkt, dass der Compiler-Fehler:

Fehler: C2440: 'initialisieren': aus 'initializer-Liste' auf 'arma :: Col' Kein Konstruktor kann den Quelltyp nehmen, nicht konvertieren oder Konstruktor Überlastung Auflösung von mehrdeutigen

+0

Haben Sie es von Grund auf neu gebaut? – SingerOfTheFall

Antwort

4

Im Ordner Gürteltier-6.100.1 \ include \ armadillo_bits eine config.hpp genannt Konfigurationsdatei ist.

Dort finden Sie einen Absatz zu sagen:

#if !defined(ARMA_USE_CXX11) 
// #define ARMA_USE_CXX11 
//// Uncomment the above line to forcefully enable use of C++11 features (eg. initialiser lists). 
//// Note that ARMA_USE_CXX11 is automatically enabled when a C++11 compiler is detected. 
#endif 

So sieht es aus wie die MSVC2013 64bit als C++ 11-Compiler von Armadillio nicht erkannt wird. So kommentieren Sie die Zeile

// #define ARMA_USE_CXX11 

löste mein Problem. Jetzt funktioniert das wie Charme:

vec v = { 1.0, 2.0, 3.0 }; 
cout<<v; 
+1

MSVC 2013 unterstützt C++ 11 nicht richtig, deshalb wird es nicht erkannt. – hbrerkere

5

Die Dokumentation sagt, dass vec ist ein typedef für Col<double:

For convenience the following typedefs have been defined:
vec = colvec = Col< double >

Wenn wir uns auf die Col Konstrukteure betrachten, werden wir den folgenden Konstruktor finden, die eine Initialisiererliste akzeptiert:

#if defined(ARMA_USE_CXX11) 

    template<typename eT> 
    inline 
    Col<eT>::Col(const std::initializer_list<eT>& list) 
    { 
    <...> 
    } 

Also meine Vermutung wäre, dass ARMA_USE_CXX11 nicht definiert ist, und damit dieser Konstruktor ist nicht zugänglich.

+0

Ja, das war richtig, ich habe es repariert, sehe meine Antwort. Vielen dank für Deine Hilfe. – newandlost

Verwandte Themen