Czy mogę przeciążać przeładowania operatorów [C++]


(MrGalek) #1

Witam
Mam pytanie, robię przeładowanie operatora <<, przeładowanie jest napisane w klasie i wpada do niego jeden argument. Niestety argumenty będą różnymi typami (dokładnie trzy string, double i int). Próbowałem zrobić standardowe przeciążenie (czyli 3 razu napisana metoda-przeładowanie ale z różnymi typami argumentów) niestety VS2015 nie pozwala mia na tę sztuczkę.
Robię tak

void Czarymary::operator<<(int Zaklecie)
{
    doNow(Zaklecie)//metoda obrabiająca dalej - nie ważne teraz
}

void Czarymary::operator<<( string Zaklecie)
{
    //Tutaj będę chciał, przerkonwertować stringa na inta i posłać dalej
}

I dostaję błąd:

no instance of overloaded function "Czarymary::operator<<" matches the specified type 

Dodam że w pliku nagłówkowym wszystko jest okej.

Z góry dzięki pozdrawiam
MrGalek
 


(Fizyda) #2

Masz błąd ponieważ robisz to w sposób niewłaściwy. Nie możesz przeciążać operatorów jak Ci się podoba, metody przeciążające operator przyjmują konkretne argumenty i czasami muszą zwracać konkretny typ, nie ma tutaj samowolki.

Zobacz sam:

http://www.cplusplus.com/doc/tutorial/templates/

http://www.cprogramming.com/tutorial/operator_overloading.html (na samym dole)

nawet tutaj: https://pl.wikibooks.org/wiki/C%2B%2B/Przeciążanie_operatorów


(pr0100) #3

to co jest chcesz zrobić jest złe… płakałem jak pisałem :frowning:

 

http://pastebin.com/ZByr9sb1

 

#include <iostream>

#include <memory>



class Czarymary {

  public:

	void operator<<(int z) {

		std::cout << "casted int spell: " << z << "\n";

	}



	void operator<<(std::string z) {

		std::cout << "casted string spell: " << z.c_str() << "\n";

	}



	void operator<<(double z) {

		std::cout << "casted double spell: " << z << "\n";

	}

};



int main()

{

	auto obj = Czarymary();

	obj << 2;

	obj << "Fireball";

	obj << 6.5;



	auto ptr = std::unique_ptr<Czarymary>();

	(*ptr) << 3;

	(*ptr) << "Icestorm";

	(*ptr) << 3.2;



	return 0;

}

 

 


(MrGalek) #4

Dzięki za pomoc. Problemem prawdopodobnie był brak referencji w argumencie ;) 
Pozdrawiam MrGalek