• 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

Aruba Cloud PRO i VPS, Openstack, VMWare, MS Hyper-V
+1 głos
85 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,310 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,620 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 164 wizyt
pytanie zadane 12 lutego 2016 w C i C++ przez k222 Nałogowiec (30,170 p.)
0 głosów
0 odpowiedzi 84 wizyt
0 głosów
1 odpowiedź 357 wizyt

90,405 zapytań

139,021 odpowiedzi

311,538 komentarzy

60,085 pasjonatów

Motyw:

Akcja Pajacyk

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

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...