Wie ktos o co moze chodzic?
y. na oko musisz:
przeładować operator+(string, twojaklasa), ale też operator+(twojaklasa, string)... a wszelkie literały zamienić na string("literał"), wtedy masz obiekt tymczasowy typu, o który Ci chodzi - czyli string. Oczywiście obiekty tymczasowe są obiektami stałymi. Tyle na oko ;-P
A nie tak przypadkiem?
template<typename T>
string operator+ (string& s, const T& i)
{
return s+toString(i);
}
Dodajac do wskaznika jakiegos inta zawsze bede mial wskaznik :) o to chyba chodzi :)
Ok,a teraz mam problem z linkowaniem :]
OK, mam :)
definicja nie moze byc oddzielona od deklaracji. trzeba po prostu definicje umiescic w pliku .h bez deklarowania nigdzie czegokolwiek :)
-
- dokladnie tak. wskaznik+int = przesuniety wskaznik. "abc" + 1 == &("abc"[1]) == "bc"
-
ano, definicja template'a moze byc oddzielona od kodu. tylko wtedy jesli sie czegos dodatkowo nie zrobi, to kompilator wygeneruje N potrzebnych specjalizacji sygnatur funkcji/klas, a nie bedzie zadnych specjalizacji kodu.. zazwyczaj to sie robi wlasnie tak jak zrobiles - calego template daje sie w .h i mamy N definicji i ... N*liczba plikow .cpp specjalizacji kodu. czyli kazdy plik .cpp ktory robi #include "tentemplate" sobie sam generuje specjalizacje i zawiera calosc kodu template'a. jakie sa minusy no to dosc oczywiste. poprzedni przypadek mozna zas naprawic w ten sposob, ze piszesz normalnie sygnature w .h, implemetacje w .cpp, natomiast w .cpp dodajesz jeszcze explicit specialization. np:
.hpp:
template<typename T> T F(T const& arg);
.cpp:
template<typename T> T F(T const& arg)
{ // jakas impletancja..
}
//explicit specialization
template<> int F<int>(int const & );
template<> float F<float>(float const & );
template<> double F<double>(double const & );
//... i tak dla kazdego T jakie sie pojawia w reszcie kodu
to jest rozwiazanie 'najlepsze', bo wtedy kod wynikowy tego template siedzi tylko w tym jednym .cpp. ale jakei upierdliiiweee.. dlatego stosuje sie rozwiazanie "wszystko-w-.hpp"