2017-12-28 26 views
0

Dieses bestimmte Stück Code schlägt auf gcc 5.4 fehl, funktioniert aber auf vielen anderen, msvc 2015, clang und neueren Versionen von gcc.Anonyme Struktur, um die Funktionskonvertierung zu beschleunigen, scheitert an gcc 5.4

#include <boost/function.hpp> 

#include <map> 
#include <string> 

typedef boost::function1<int, double> fn; 

class fn_map : public std::map<std::string, fn> { 
public: 
    void reg(const std::string&, fn); 
}; 

int main(int, char**) { 
    fn_map fm; 

    struct { 
     int operator()(double v) { 
      return static_cast<int>(v * 2.); 
     } 
    } factory; 

    fm.reg("factory", factory); 
} 

void fn_map::reg(const std::string& nm, fn f) { 
    this->insert(std::make_pair(nm, f)); 
} 

Fehlermeldung:

no known conversion for argument 2 from 'main(int, char**)::<anonymous struct>' to 'fn {aka boost::function1<int, double>}' 

Die letzte ubuntu LTS noch gcc hat 5, so dass, wenn möglich, möchte ich diesen Code haben, auch dort zu arbeiten.

Antwort

0

Das Verschieben der struct-Definition aus der Funktionsdefinition in einen nicht anonymen Typ scheint dieses spezielle Problem auf gcc zu umgehen.

#include <boost/function.hpp> 

#include <map> 
#include <string> 

typedef boost::function1<int, double> fn; 

class fn_map : public std::map<std::string, fn> { 
public: 
    void reg(const std::string&, fn); 
}; 

namespace { 
    struct factory_t { 
     int operator()(double v) { 
      return static_cast<int>(v * 2.); 
     } 
    }; 
} 

int main(int, char**) { 
    fn_map fm; 

    factory_t factory; 

    fm.reg("factory", factory); 
} 

void fn_map::reg(const std::string& nm, fn f) { 
    this->insert(std::make_pair(nm, f)); 
} 
Verwandte Themen