'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 werdenIrgendwie 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; }
-
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 initializationSollte 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 initializationSollte 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.