Částečně vázaný přítel šablonové třídy – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Částečně vázaný přítel šablonové třídy – C / C++ – Fórum – Programujte.comČástečně vázaný přítel šablonové třídy – C / C++ – Fórum – Programujte.com

 

vdolek0
Newbie
17. 10. 2009   #1
-
0
-

Lze v C++ vytvořit něco jako částečne vázaného přítele šablonové třídy?

Myslím tím: mám šablonovou třídu a chci přátelskou funkci, která bude také šablonou, ale bude vázána na typ třídy.

Jednosušeji řečeno chci přetížit operátor << kvůli výpisu objektu třídy, která je šablonová a nechci ten operátor svázat pevně s std::ostream, ale obecně s std::basic_ostream<...>.


Myslel jsem, že to půjde takto, ale hlásí mi to přístup k privátním položkám třídy (nepovažuje to tu funkci za přítele)


	template <typename float_t>

class bod;

// prototyp šablonové funkce
template <typename char_t, typename traits, typename float_t>
std::basic_ostream<char_t, traits>&
operator <<(std::basic_ostream<char_t, traits> &os, const bod<float_t> &b);

template <typename float_t = double>
class bod
{
private:
float_t x,
y;
public:
bod(float_t fx, float_t fy) : x(fx), y(fy) {}

// částečně vázaný šablonový přítel
template <typename char_t, typename traits>
friend std::basic_ostream<char_t, traits>&
operator << <>(std::basic_ostream<char_t, traits> &os, const bod<float_t> &b);
};


template <typename char_t, typename traits, typename float_t>
std::basic_ostream<char_t, traits>&
operator <<(std::basic_ostream<char_t, traits> &os, const bod<float_t> &b)
{
return (os << "[" << b.x << ";" << b.y << "]");
}


Předem díky

Nahlásit jako SPAM
IP: 213.220.248.–
AdamHlavatovic0
Stálý člen
18. 10. 2009   #2
-
0
-

Skus toto

// std

#include <ostream>
using std::basic_ostream;
#include <iostream>
using std::wcout;


template <typename float_t>
class basic_point
{
public:
typedef float_t float_type;

basic_point(const float_t & x, const float_t & y)
: _x(x), _y(y)
{
}

template <typename char_t, class traits>
friend basic_ostream<char_t, traits> & operator<<(
basic_ostream<char_t, traits> & o, basic_point<float_t> & pt)
{
o << pt._x << ", " << pt._y;
return o;
}

private:
float_t _x;
float_t _y;
};

typedef basic_point<double> point;


int main(int argc, wchar_t * argv[])
{
point pt(12.21, 15.51);
wcout << L"pt = " << pt << "\n";
return 0;
}

Nahlásit jako SPAM
IP: 94.229.32.–
vdolek0
Newbie
18. 10. 2009   #3
-
0
-

To AdamHlavatovic : Díky moc, přesně takhle jsem to myslel. Já sem se pořád snažil dát definici mimo třídu a to asi v tomhle případě nejde.

Nahlásit jako SPAM
IP: 213.220.248.–
AdamHlavatovic0
Stálý člen
19. 10. 2009   #4
-
0
-

> Já sem se pořád snažil dát definici mimo třídu a to asi v tomhle případě nejde.
Nie v tom problem nieje, mimo triedu to to dat ide.

Nahlásit jako SPAM
IP: 94.229.32.–
vdolek0
Newbie
19. 10. 2009   #5
-
0
-

To AdamHlavatovic : Hele, a jak má pak vypadat ta definice (mimo třídu)?

Toto mi hlásí: multiple template parameter lists are not allowed

template <typename float_t>

template <typename char_t, typename traits>
std::basic_ostream<char_t, traits>& operator <<(
std::basic_ostream<char_t, traits> &os, const basic_point<float_t> &b)
{
os << "[" << b._x << ";" << b._y << "]";
return os;
}


A toto mi logicky hlásí: že funkce basic_point nemá přísup k privátním členům třídy
template <typename char_t, typename traits, typename float_t>

std::basic_ostream<char_t, traits>& operator <<(
std::basic_ostream<char_t, traits> &os, const basic_point<float_t> &b)
{
os << "[" << b._x << ";" << b._y << "]";
return os;
}

Nahlásit jako SPAM
IP: 213.220.248.–
AdamHlavatovic0
Stálý člen
22. 10. 2009   #6
-
0
-

> Hele, a jak má pak vypadat ta definice (mimo třídu)?
Napr. takto:

template<...>

class basic_point
{
...
template <typename _ft1, typename char_t, class traits>
friend basic_ostream<char_t, traits> & operator<<(
basic_ostream<char_t, traits> & o, basic_point<_ft1> & pt);
...
};

template <typename _ft1, typename char_t, class traits>
basic_ostream<char_t, traits> & operator<<(
basic_ostream<char_t, traits> & o, basic_point<_ft1> & pt)
{
o << pt._x << ", " << pt._y;
return o;
}

Nahlásit jako SPAM
IP: 147.175.158.–
vdolek0
Newbie
23. 10. 2009   #7
-
0
-

To AdamHlavatovic : Jo ták, tak to mě nenapadlo, jinak díky moc.

Nahlásit jako SPAM
IP: 213.220.248.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 144 hostů

Podobná vlákna

Vázaný seznam — založil Pajda

Dvousměrně vázaný seznam — založil Ondrášek

Vázaný seznam v MCU — založil Pavelv

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý