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

Я начал новый проект, потому что у меня была такая же ошибка в другом более крупном проекте. Ошибка возникает, когда я пытаюсь выделить пространство, используя новое ключевое слово. Если эта ошибка глупа, простите меня, потому что я не запрограммировал ничего за последние месяцы.Ошибка компоновщика при использовании класса шаблона?

/********************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; 
} 

ответ

10

Благодаря странности в модели компиляции С ++, вы не можете отделить .h и .cpp файлы очень чисто для шаблонных классов. В частности, любая единица перевода (исходный файл C++), которая хочет использовать класс шаблона, должна иметь доступ ко всему определению шаблона. Это странная причуда, но, к сожалению, она здесь, чтобы остаться.

Один из вариантов заключается в том, чтобы реализовать реализацию в файле заголовка, а не в источнике, а затем вообще не иметь .cpp-файл. Например, у вас может быть этот заголовок:

#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 

Надеюсь, это поможет!

+0

«но, к сожалению, он здесь, чтобы остаться» - пока мы не получим модули. \ * пересекает пальцы * – Xeo

+0

РАБОТАЕТ КАК ШАРМ, просто нужно было немного исправить ваше решение. вместо добавления кода в файле .h я просто включил файл .cpp в нижней части файла .h. Это же результат, как если бы обе части находились в одном файле. в "hijo.cpp" #ifndef hijo_cpp #define hijo_cpp и в нижней #endif ... Спасибо и за ваш ответ ... – HoNgOuRu

+0

должен ждать больше 8 минут, чтобы отметить вопрос как ответ – HoNgOuRu

Смежные вопросы