Szablony (problem: Undefined reference to...)
Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Zarejestruj się!

Szablony (problem: Undefined reference to...)

AutorWiadomość
Temat założony przez niniejszego użytkownika
Szablony (problem: Undefined reference to...)
» 2014-12-15 14:16:34
PLIK qwerty.hpp:
C/C++
#ifndef qwerty_hpp
#define qwerty_hpp

#include <iostream>

namespace My
{
    template < class Type >
    class Own_Complex
    {
        Type Re; // czesc rzeczywista
        Type Im; // czesc urojona
       
    public:
        Own_Complex( Type Re_ = 0.0, Type Im_ = 0.0 )
            : Re( Re_ )
             , Im( Im_ )
        { }
       
        friend std::ostream & operator <<( std::ostream & strum, My::Own_Complex < Type > & object );
    };
   
    template < class Type >
    std::ostream & operator <<( std::ostream & strum, My::Own_Complex < Type > & object )
    {
        strum << object.Re << "\n" << object.Im << std::endl;
        return strum;
    }
}

#endif
PLIK MAIN.CPP:
C/C++
#include <iostream>
#include "qwerty.hpp"

int main()
{
    My::Own_Complex < double > object( 5.5, 14.345 );
    std::cout << object;
   
    return 0;
}
Error:
...\main.cpp|10|undefined reference to `My::operator<<(std::ostream&, My::Own_Complex<double>&)'|

P-122893
» 2014-12-15 15:24:14
w std mamy klasę complex
http://www.cplusplus.com​/reference/complex/complex/
operatory
http://www.cplusplus.com​/reference/complex/complex​/operators/
operator <<
template<class T, class charT, class traits>
  basic_ostream<charT,traits>&
    operator<< (basic_ostream<charT,traits>& ostr, const complex<T>& rhs);


Ty masz

template < class Type >
    std::ostream & operator <<( std::ostream & strum, My::Own_Complex < Type > & object )

gdzie
charT, traits
The template types for the basic_istream or basic_ostream object.
Typy szablonów dla basic_istream lub basic_ostream.

nie pamiętam do czego to jest potrzebne  ?


http://www.tutorialspoint.com​/cplusplus/cpp_operators.htm

<< Binary Left Shift Operator. The left operands value is moved left by the number of bits specified by the right operand. 


może to Ci już wystarczy do poprawienia kodu

Sorry za niepełną odpowiedz
 
 
P-122896
» 2014-12-15 15:31:03
Usuń deklarację zaprzjaźnionego operatora <<, i zdefiniuj << jako szablon przy użyciu publicznych funkcji klasy, które dają dostęp do składowych Re i Im.

Moższ też usuąć szablon i zdefiniować zaprzyjaźniony operator wewnątrz klasy, ale pierwsza opcja wydaje mi się lepsza, zgodnie z zasadą, że im mniej funkcji ma dostęp do składowych prywatnych, tym lepiej.
P-122897
Temat założony przez niniejszego użytkownika
» 2014-12-15 15:36:49
Ok, popracuję.
Na razie udało mi się ten sam kod skompilować w jednym pliku. Z taką różnicą, że deklarując przyjaźń w klasie Own_Complex wklejam ciało przeładowania operatora << (niby wtedy nie jest ono składnikiem klasy, a oszukuje kompilator).
P-122898
« 1 »
 Strona 1 z 1