konwersja do string z szablonem

0

Witam chciałem sobie napisac mała funkcje konwertujacą liczby do string, z użyciem szablonów i zmodziłem coś takiego:

template <typename N>
inline const N& convertFromString(const std::string& s)
{
    std::istringstream i(s);
    N& x;
    if (i >> x)
        return x;
    return 0;
}

Ale przy próbie kompilacji z kodem :

double x =0.0f;
std::string str = "10.0f";
x = convertFromString(str);

kompilator ładnie mnie informuje:

error: no matching function for call to `convertFromString(std::string&)'

I nie moge obejsc tego, możę mi ktoś wyjąsnić gdzie jest błąd lub czego brakuje?.

Z góry dzięki.

0

Wydaje mi się, że kompilator nie ma pojęcia jaką funkcję utworzyć, ponieważ nie ma tego zaznaczonego w parametrach funkcji. Spróbuj napisać

inline const N& convertFromString(const std::string& s, N& a)

po to, żeby wskazać później kompilatorowi którą funkcję ma stworzyć. Parametr 'a' nic nie wniesie, ale wskaże kompilatorowi typ funkcji.

Jak nie chcesz tak kombinować to możesz przy wywołaniu napisać po prostu:

x = convertFromString<double>(str);

0

Niestety w takim przypadku nie da się dopasować szablonu przez typ zwracany.
Pozostaje, np.:

    x = convertFromString<double>(str);

albo poczytaj
http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.3

Tam jest szablon, który pobiera referencję do x jako argument i przez to można zwrócić wartość też w x.

0

juz probowałem z:

 x = convertFromString<double>(str);

Wtedy kompilator ( gcc ) wywala mi:

strfunction.hpp: In function const N& convertFromString(const std::string&) [with N = double]': main.cpp:14: instantiated from here strfunction.hpp:34: error: x' declared as reference but not initialized
main.cpp instantiated from here

czepia się wtedy deklaracji

 N& x;

Zastanawiam sie nad zrobieniem tego w klasie i uzyciu operatorów.

0

W miare sobie poradziłem ale to jeszcze nie to co bym chciał.

Ale mam kilka pytań, czy szablon moze przekazać format do wnętrza funkcji ( błąd wyżej ).

Czy listy inicjacji można stosować tylko przy konstruktorach klas ?.

Czy można dodać własne deklaracje dla np. std::string, probowałem zrobić własną klase i dziedziczyć z std::string ale efek był taki że operatory mialy nie zgodnośc typów wieć nic z tego bo trzeba by je całe pisac od początku albo przynajmniej wymusząc typ.

0

Masz chyba błąd w linijce 'N& x;'. Po co ten '&' ? Wywal go to powinno się skompilować.
I po co jest referencja w: inline const N& conver... ?

czy szablon moze przekazać format do wnętrza funkcji ( błąd wyżej )?
Nie rozumiem pytania. O jaki format chodzi?

Czy listy inicjacji można stosować tylko przy konstruktorach klas ?.
Tak. Służy ona min. do nadawania wartości początkowych składnikom const. Nie może być zatem użyta w innym miejscu niż konstruktor.

Czy można dodać własne deklaracje dla np. std::string, probowałem zrobić własną klase i dziedziczyć z std::string ale efek był taki że operatory mialy nie zgodnośc typów wieć nic z tego bo trzeba by je całe pisac od początku albo przynajmniej wymusząc typ.
Spróbuj zadeklarować konwersje ze swojego typu na typ std::string bez deklarowania operatorów. Sam jestem ciekaw czy to możliwe :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1