Klasa szablonowa

0

Mam plik Complex.h

#ifndef COMPLEX_COMPLEX_H_
#define COMPLEX_COMPLEX_H_

template<typename T>class Complex
{
private:
	T real;
	T imaginary;

public:
	Complex();
	Complex(T real, T imaginary);
	T getModules(void);
	~Complex();
};
#endif /* COMPLEX_COMPLEX_H_ */

Complex.cpp

#include <cmath>
#include "Complex.h"

template <typename T>Complex<T>::Complex()
{

}

template <typename T> Complex<T>::Complex(T real, T imaginary)
{
	this->real = real;
	this->imaginary = imaginary;
}

template <typename T> T Complex<T>::getModules()
{
	return sqr(real*real + imaginary*imaginary);
}

template <typename T> Complex<T>::~Complex()
{

}

main.cpp

#include <iostream>

#include "Complex.h"

using namespace std;

int main()
{
	Complex <double> c1(7.0, 8.0);

	return 0;
}

W linii tworzenia obiektu widzę następujący błąd kompilacji:

undefined reference to `Complex<double>::Complex(double, double)
undefined reference to `Complex<int>::~Complex()

Na prawdę nie wiem gdzie może być problem?

2

Definicje metod szablonowych muszą być widoczne w każdym miejscu, gdzie są użyte, chyba, że zdefiniujesz z góry kilka konkretyzacji - to wtedy te nie będą musiały być.

W praktyce oznacza to, że powinieneś przenieść definicje do nagłówka.

Jeśli klasa jest duża i chcesz zachować podział deklaracja/definicja, dodaj definicje do drugiego pliku, np. complex_impl.h i inkluduj jego w miejscu użycia. Alternatywne spotykane nazewnictwo to complex_fwd.h i complex.h.

Technicznie rzecz biorąc możesz po prostu zainclude'ować complex.cpp w każdym miejscu użycia, ale imo to jest mylące; niech nagłówki będą nagłówkami.

2

Problem polega na tym że klasy szablonowe mogą być implementowane tylko i wyłącznie w pliku nagłówkowym. Jeśli szukasz typu complex to istnieje już implementacja: std::complex<>

Dodatkowo,

T getModules(void);

argument typu void jest niepotrzebny w języku c++.

0

Właśnie się przesiadam z języka C na C++. Chcę trochę poćwiczyć i napisać swoją klasę Complex.
Dzięki za pomoc.

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