• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Tworzenie szablonu zamiast dwóch bliźniaczych funkcji sprawdzających zapisu i odczytu pliku

Object Storage Arubacloud
+1 głos
110 wizyt
pytanie zadane 2 września 2016 w C i C++ przez plkpiotr Stary wyjadacz (12,420 p.)
otagowane ponownie 2 września 2016 przez plkpiotr

W jaki sposób poprawnie stworzyć szablon następujących funkcji?

Czy jest to w ogóle możliwe dla ifstream& oraz ofstream&?

void checkOpening(ifstream& handle);
void checkOpening(ofstream& handle);
void checkOpening(ifstream& handle) {
	if (handle.good())
		cout << "The input file has been opened correct." << endl << endl;
	else {
		cout << "The file hasn't been opened." << endl;
		cout << "Application will be closed." << endl;
		exit (STATUS);
	}
}

void checkOpening(ofstream& handle) {
	if (handle.good())
		cout << "The output file has been opened correct." << endl << endl;
	else {
		cout << "The file hasn't been opened." << endl;
		cout << "Application will be closed." << endl;
		exit (STATUS);
	}
}

Próbowałem użyć poniższego zapisu...

template <typename T>
void checkOpening(T& handle);
template <typename T>
void checkOpening(T& handle) {
	if (handle.good())
		cout << "The file has been opened correct." << endl << endl;
	else {
		cout << "The file hasn't been opened." << endl;
		cout << "Application will be closed." << endl;
		exit (STATUS);
	}
}

Jednak kompilator wyrzuca błędy podczas wywoływania funkcji określonej szablonem o następującej treści:

||=== Build: Debug in 01 Tester (compiler: GNU GCC Compiler) ===|
obj\Debug\main.o||In function `main':|
E:\01 [C++]\003\main.cpp|21|undefined reference to `void checkOpening<std::basic_ifstream<char, std::char_traits<char> > >(std::basic_ifstream<char, std::char_traits<char> >&)'|
E:\01 [C++]\003\main.cpp|27|undefined reference to `void checkOpening<std::basic_ifstream<char, std::char_traits<char> > >(std::basic_ifstream<char, std::char_traits<char> >&)'|
E:\01 [C++]\003\main.cpp|33|undefined reference to `void checkOpening<std::basic_ofstream<char, std::char_traits<char> > >(std::basic_ofstream<char, std::char_traits<char> >&)'|
||error: ld returned 1 exit status|
||=== Build failed: 4 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

Bardzo proszę o wyjaśnienie, czego tutaj nie rozumiem lub co robię niepoprawnie... frown

komentarz 2 września 2016 przez obl Maniak (51,280 p.)
A w czym to piszesz bo u mnie na Visual Studio się przekompilowało bez problemu.
komentarz 2 września 2016 przez plkpiotr Stary wyjadacz (12,420 p.)
Dziękuję za zainteresowanie, problem został rozwiązany - wyjaśnienie poniżej :)

1 odpowiedź

+1 głos
odpowiedź 2 września 2016 przez unknown Nałogowiec (39,560 p.)
wybrane 2 września 2016 przez plkpiotr
 
Najlepsza
Definicja metody(lub funkcji) szablonowej musi być w tej samej jednostce translacji(pliku).
komentarz 2 września 2016 przez plkpiotr Stary wyjadacz (12,420 p.)
Istotnie ;) Umieszczenie definicji tej funkcji w pliku nagłówkowym rozwiązało problem :)

Podobne pytania

0 głosów
3 odpowiedzi 498 wizyt
pytanie zadane 12 lutego 2016 w C i C++ przez k222 Nałogowiec (30,150 p.)
0 głosów
0 odpowiedzi 120 wizyt
0 głosów
1 odpowiedź 502 wizyt

92,555 zapytań

141,403 odpowiedzi

319,554 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...