• 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
105 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 486 wizyt
pytanie zadane 12 lutego 2016 w C i C++ przez k222 Nałogowiec (30,150 p.)
0 głosów
0 odpowiedzi 119 wizyt
0 głosów
1 odpowiedź 502 wizyt

92,516 zapytań

141,340 odpowiedzi

319,307 komentarzy

61,906 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...