Nie działa szablon funkcji

0
template <typename T>
struct MyStruct
{
    T skladowa;
    MyStruct(T s) : skladowa(s) {};
    friend ostream & operator<<(ostream& os, MyStruct<T>& ref);

};


template <typename T>
ostream & operator<<(ostream& os, MyStruct<T> & ref) {
    os << ref.skladowa;
    return os;
}

int main()
{
    MyStruct<int> obiekt(22);
    cout << obiekt;

Otrzymuję błąd kompilacji: undefined reference to `operator<<(std::ostream&, MyStruct<int>&)'. Czyżbym podał kompilatorowi za mało informacji żeby utworzył specjalizację funkcji?

0

Chodzi o to?

#include <iostream>

using namespace std;

template <typename T>
struct MyStruct
{
        T skladowa;
        MyStruct(T s) : skladowa(s) {};
        template<typename U>
        friend ostream & operator<<( ostream&, U& );
};

template <typename T>
ostream & operator<<(ostream& os, T& ref)
{
        os << ref.skladowa;
        return os;
}

int main()
{
        MyStruct<int> obiekt(22);
        cout << obiekt << endl;
        return 0;
}
0

Owszem, teraz działa. Ale nadal nie rozumiem dlaczego z szablonu funkcji nie można było wyprodukować specjalizacji na podstawie przysłanego doń typu obiektu.

4

Rozwiązanie od @goostaw jest błędne - jak tylko przyjdzie druga klasa w programie, którą zechcesz wypisać dojdzie do konfliktu. Konflikt ten można rozwiązać za pomocą SFINAE, ale to nie jest potrzebne, skoro są fundamentalne problemy w definicji klasy: zadeklarowana funkcja ostream & operator<<(ostream& os, MyStruct<T>&ref)nie jest szablonem, a jej "implementacja" już tak. Rozwiązania (od razu dodaję const do parametru, żeby było idiomatycznie):

Użyj globalnego op<<:

template <typename T>
struct MyStruct
{
    T skladowa;
    MyStruct(T s) : skladowa(s) {};
};

template <typename T>
ostream & operator<<(ostream& os, MyStruct<T> const& ref) {
    os << ref.skladowa;
    return os;
}

Zdefiniuj funkcję inline

template <typename T>
struct MyStruct
{
    T skladowa;
    MyStruct(T s) : skladowa(s) {};
    friend ostream & operator<<(ostream& os, MyStruct<T>const& ref) {
        os << ref.skladowa;
        return os;
    }
};

Zadeklaruj szablon, skoro implementacją jest szablon:

template <typename T>
struct MyStruct
{
    T skladowa;
    MyStruct(T s) : skladowa(s) {};
    
    template<typename U> friend
    ostream & operator<<(ostream& os, MyStruct<U>const& ref);

};

template <typename T>
ostream & operator<<(ostream& os, MyStruct<T> const& ref) {
    os << ref.skladowa;
    return os;
}

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