funkcje friend w szablonie

0
template <class T>
class C
{
protected:
   T Value;
public:
   template <class T> friend ostream& operator<<(ostream &os, const C<T> &c);
};

template <class T>
ostream& operator<<(ostream &os, const C<T> &c)
{
   os << c.Value;
   return os;
}
C<int> C1;
cout << C1;

[C++ Error] Unit1.cpp(168): E2335 Overloaded 'operator ostream & << <int>(ostream &,const C<int> &)' ambiguous in this context

O co chodzi ?

0

przerabialiśmy to niedawno... http://4programmers.net/Forum/viewtopic.php?id=92895

0

Niestety jest to problem innej natury, zmiana T na R tu nic nie pomoże, podane przez ciebie rozwiązanie kompiluje się z identycznym błędem. Czyżby coś było nie tak z moim BCB ?

0

fucktycznie. BCB i VC++ wyrzucają to samo a w C::B działa. hmm...

0

W VS2005 nie wyrzuca błędu.

0

Właściwie, to chyba powinno być coś w ten deseń, ale szczerze mówiąc, to nie gwarantuje, że to będzie dobrze:

      1 #include <iostream>
      2
      3 using namespace std;
      4
      5 template <class T>
      6 class C
      7 {
      8 protected:
      9     T Value;
     10
     11 public:
     12     friend ostream& operator<<(ostream &os, const C<T> &c);
     13 };
     14
     15 template <class T>
     16 ostream& operator<<(ostream &os, const C<T> &c)
     17 {
     18     os << c.Value;
     19 return os;
     20 }
     21
     22 int main()
     23 {
     24 return 0;
     25 }

// sorki, wklejone z vima

0

Z szablonami jest jak widać wciąż kłopot. Im nowszy kompilator tym lepiej sobie z nimi radzi, a w tych gorzej przystosowanych musimy zdefiniować funkcję wewnątrz klasy:

#include <iostream>
#include <conio.h>

using namespace std;

template <class T> class C
{
    protected:
        T Value;
    public:
        friend ostream& operator<<(ostream &os, const C<T> &c)
        {
            os << c.Value;
            return os;
        }
};

int main()
{
    C<int> C1;
    cout << C1;
    _getch();
    return 0;
}

Dostaniemy globalne przeładowania operatora, ale działające inline.

0

Kompiluje sie pod MinGWem. Tego akurat nie sprawdzalem pod GCC, ale moje wlasne programy sie rowniez tam kompiluja, wiec działac powinno.

#include <iostream>
using namespace std;

template <class tp="Tp"> class C; // deklaracja szablonu

template <class tp="Tp"> ostream& operator<< (ostream &, const C<tp> &);

template <class tp="Tp">
class C
{
public:
Tp war;
friend ostream& operator<< <> (ostream &, const C<tp> &); // Uwazaj na te nawiasy <> !!
};

template <class tp="Tp"> ostream& operator<< (ostream &os, const C<tp> &c) // Tutaj juz tych nawiasow nie ma!!
{
os << c.war;
return os;
}
int main()
{
C<int> zmienna;
zmienna.war = 5;
cout << zmienna;
}

Jak cos to pisz na [email protected]

0

b>@Pituszek:</b
nieźle! dzięki za ten kodzik.
C::B (gcc, mingw): działa
BCB 6: działa
VC++ 6: działa po zmianie
friend ostream& operator<< <> (ostream &, const C<tp> &); // Uwazaj na te nawiasy <> !!
na
friend ostream& operator<< (ostream &, const C<tp> &); // Uwazaj na te nawiasy <> !!

0

Pisanie tych nawiasow <> jest zgodne ze standardem, a jakakolwiek zgodnoscia VC++ niestety pochwalic sie nie moze :).

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