2012-02-07 27 views
5
I'm getting an "unresolved external symbol "public:__thiscall hijo<int>::hijo<int>(void)" referenced in function_main 

Rozpocząłem nowy projekt, ponieważ wystąpił ten sam błąd w innym większym projekcie. Wystąpił błąd podczas próby przydzielenia miejsca za pomocą nowego słowa kluczowego. Jeśli ten błąd jest głupi, proszę wybaczyć, ponieważ nie zaprogramowałem niczego w ciągu ostatnich miesięcy.Błąd łącznika podczas korzystania z klasy szablonu?

/********************file hijo.h******************/ 
#pragma once 
#ifndef hijo_h 
#define hijo_h 

template <class A> 
class hijo 
{ 
public: 
    hijo(void); 
    ~hijo(void); 
}; 
#endif 


    /********************file hijo.cpp***************/ 
    #include "hijo.h" 
#include <iostream> 
using namespace std; 

template <class A> 
hijo<A>::hijo(void) 
{ 
} 
template <class A> 
hijo<A>::~hijo(void) 
{ 
} 
    /*********************at main() function ***************/ 

#include <iostream> 
#include "hijo.h" 

int main(){ 

    hijo<int> *h = new hijo<int>; <---- PROBLEM AT THIS LINE 

    system("pause"); 
    return 0; 
} 

Odpowiedz

10

Z powodu tajemniczości w modelu kompilacji C++ 's, nie można oddzielić pliki .cpp i .h bardzo czysto dla klas szablonu. W szczególności każda jednostka tłumaczeniowa (plik źródłowy C++), która chce użyć klasy szablonu, musi mieć dostęp do całej definicji szablonu. To dziwne dziwactwo tego języka, ale niestety jest tutaj.

Jedną z opcji jest umieszczenie implementacji w pliku nagłówkowym, a nie w źródle, aby w ogóle nie mieć pliku .cpp. Na przykład możesz mieć ten nagłówek:

#pragma once 
#ifndef hijo_h 
#define hijo_h 

template <class A> 
class hijo 
{ 
public: 
    hijo(void); 
    ~hijo(void); 
}; 

/* * * * Implementation Below This Point * * * */ 

template <class A> 
hijo<A>::hijo(void) 
{ 
} 
template <class A> 
hijo<A>::~hijo(void) 
{ 
} 

#endif 

Mam nadzieję, że to pomoże!

+0

"ale niestety jest tu na stałe" - dopóki nie otrzymamy modułów. \ * krzyżuje palce * – Xeo

+0

DZIAŁA JAK CHRONIĆ, musiałem tylko trochę poprawić twoje rozwiązanie. zamiast dodawać kod w pliku .h, właśnie zawarłem plik .cpp na dole pliku .h. To taki sam wynik, jak gdyby obie części znajdowały się w tym samym pliku. w "hijo.cpp" #ifndef hijo_cpp #define hijo_cpp i na dole #endif ... Thank u za odpowiedź ... – HoNgOuRu

+0

muszę czekać 8 więcej minut, aby oznaczyć pytanie jak odpowiedział – HoNgOuRu

Powiązane problemy