Uczę się pisać program w paru plikach (oraz jakieś początki z przestrzeniami, dlatego tu jest ich tyle, więc nie nie piszcie proszę, że to błąd, bo to tylko dla potrzeb nauki tylu użyłem ;) ) i natrafiłem na taki problem: "unresolved externals". Dopóki wszystkie funkcje przyjmowały i zwracały double, nie było problemu. Chciałem potem uogólnić program za pomocą szablonów, lecz z tego co wyczytałem coś jest nie tak z deklaracjami funkcji. Program prosty, ma liczyć pierwiastki równania kwadratowego. Visual C++ 2013
plik główny .cpp :
#include <iostream>
#include "definicje.h"
int main()
{
double a, b, c, delta;
wczytaj::wczytajabc(a, b, c);
delta = delta::policz(a, b, c);
wynik::policz(a, b, delta);
std::cin.get();
std::cin.get();
return 0;
}
funkcje.cpp:
#include <iostream>
#include <cmath>
#include "definicje.h"
namespace wczytaj
{
template <typename T>
void wczytajabc(T &a, T &b, T &c)
{
std::cout << "Podaj a,b,c: " << std::endl;
std::cin >> a >> b >> c;
}
}
namespace delta
{
template <typename T>
T policz(T a, T b, T c)
{
T delta = b*b - 4 * a*c;
return delta;
}
}
namespace wynik
{
template <typename T>
void policz(T a, T b, T delta)
{
if (delta < 0)
wyswietl::wyswietlm();
else if (delta == 0)
{
T x = (-b) / (2 * a);
wyswietl::wyswietlr(x);
}
else
{
T x1, x2;
x1 = (-b - sqrt(delta)) / (2 * a);
x2 = (-b + sqrt(delta)) / (2 * a);
wyswietl::wyswietlw(x1, x2);
}
}
}
namespace wyswietl
{
void wyswietlm()
{
std::cout << "Delta mniejsza od 0, brak rozwiazan";
}
template <typename T>
void wyswietlr(T x)
{
std::cout << "Delta rowna 0, wynik rownania to: " << x << std::endl;
}
template <typename T>
void wyswietlw(T x1, T x2)
{
std::cout << "Delta wieksza od 0, rozwiazania rownania: " << std::endl << x1 << std::endl << x2 << std::endl;
}
}
definicje.h (tu jest pewnie coś nie tak)
#include <iostream>
namespace wczytaj
{
template <typename T>
void wczytajabc(T &a, T &b, T &c);
}
namespace delta
{
template <typename T>
T policz(T a, T b, T c);
}
namespace wynik
{
template <typename T>
void policz(T a, T b, T delta);
}
namespace wyswietl
{
void wyswietlm();
template <typename T>
void wyswietlr(T x);
template <typename T>
void wyswietlw(T x1, T x2);
}
i błędy:
error LNK2019: unresolved external symbol "void __cdecl wczytaj::wczytajabc<double>(double &,double &,double &)" (??$wczytajabc@N@wczytaj@@YAXAAN00@Z) referenced in function _main
error LNK2019: unresolved external symbol "double __cdecl delta::policz<double>(double,double,double)" (??$policz@N@delta@@YANNNN@Z) referenced in function _main
error LNK2019: unresolved external symbol "void __cdecl wynik::policz<double>(double,double,double)" (??$policz@N@wynik@@YAXNNN@Z) referenced in function _main