'const char (*)' kann nicht in 'const char *' konvertiert werden



  • Hallo,

    ich bin gerade dabei mit boost.spirit zu experimentieren, und habe dabei folgende Fehlermeldung bei einem Vergleich (==) zweier Iteratoren erhalten:

    error C2440: 'Initialisierung': 'const char (*)' kann nicht in 'const char *' konvertiert werden
    

    Irgendwie ist mir nicht ganz klar, was const char (*) sein soll.
    Heißt das, dass ich versuche einen "Zeiger auf const" in einen "const Zeiger auf mutable" zu kopieren, oder wie jetzt?

    Edit: Hmm, anscheinend nicht:

    char const * a = 0;
        char * const b = a;
    

    liefert

    'Initialisierung': 'const char *' kann nicht in 'char *const ' konvertiert werden
    


  • const char (*) ist doch ein Funktionszeiger, oder?



  • edit: ***

    (argh)



  • arghonaut schrieb:

    const char (*) ist doch ein Funktionszeiger, oder?

    Das müssten dann noch eher const char (*)() o.ä. sein, oder? Sonst würde ja der wesentliche Teil der Signatur fehlen.

    Achso, der Compiler ist übrigens VC9.



  • Tachyon schrieb:

    Das müssten dann noch eher const char (*)() o.ä. sein, oder?

    Mist, stimmt...

    Kannst du den Code soweit zusammen streichen, dass man den Fehler reproduzieren kann? Ich hab nämlich auch den Typen "const char (*)" noch nie gesehen...



  • Hier nochmal das Programm, mit dem ich getestet habe:

    #include <boost/spirit/include/qi.hpp>
    #include <boost/spirit/include/phoenix_core.hpp>
    #include <boost/spirit/include/phoenix_operator.hpp>
    #include <boost/spirit/home/support/string_traits.hpp>
    
    #include <boost/range/iterator.hpp>
    
    #include <iostream>
    #include <string>
    
    namespace qi = boost::spirit::qi;
    namespace ascii = boost::spirit::ascii;
    namespace phoenix = boost::phoenix;
    
    using qi::double_;
    using qi::_1;
    using ascii::space;
    using phoenix::ref;
    
    template<typename Range>
    bool test(Range const & rng, double & n)
    {
        //soll sowohl mit std::string als auch mit null terminierten strings arbeiten
        //daher  boost::spirit::traits::get_begin
        typename boost::range_iterator<Range const>::type i
            = boost::spirit::traits::get_begin<Range const>(rng);
        bool res = qi::phrase_parse
            ( i, boost::spirit::traits::get_end<Range const>(rng)
            , ( double_[ref(n) = _1] )
            , space );
        //ohne die benutzung von  boost::spirit::traits::get_begin
        //wuerde hier der check fuer einen full match aufgrund
        //des null terminierers fuer C strings fehlschlagen
        return res && (i == boost::spirit::traits::get_end<Range const>(rng));
    }
    
    int main()
    {
        double n;
    
        std::string s = "3.14159";
        //geht    
        std::cout << std::boolalpha << test(s, n) << std::endl;
        //liefert den oben genannten fehler
        std::cout << std::boolalpha << test("3.14159", n) << std::endl;
        std::cout << n << std::endl;
    }
    

  • Mod

    GCC sagt dazu viel besser verständlich:

    error: cannot convert ‘boost::disable_if_c<false, const char (*)[8]>::type {aka const char (*)[8]}’ to ‘boost::range_iterator<const char [8]>::type {aka const char*}’ in initialization
    

    Sollte nun klar sein, oder?



  • SeppJ schrieb:

    GCC sagt dazu viel besser verständlich:

    error: cannot convert ‘boost::disable_if_c<false, const char (*)[8]>::type {aka const char (*)[8]}’ to ‘boost::range_iterator<const char [8]>::type {aka const char*}’ in initialization
    

    Sollte nun klar sein, oder?

    Ja, danke. So ein Schrott.



  • Okay, das geht auch einfacher...

    template<typename Range>
    bool test(Range const & rng, double & n)
    {
        typename boost::range_iterator<Range const>::type i
            = boost::begin(rng);
        bool res = qi::phrase_parse
            ( i, boost::end(rng)
            , ( double_[ref(n) = _1] )
            , space | char_('\0') ); //'\0' ignorieren.
        return res && (i == boost::end(rng));
    }
    

    Ich Depp.


Anmelden zum Antworten