使用模板类时链接器错误?

时间:2012-02-07 05:39:07

标签: c++ templates inheritance linker-errors

   I'm getting an "unresolved external symbol "public:__thiscall hijo<int>::hijo<int>(void)" referenced in function_main

我开始了一个新项目,因为我在另一个更大的项目上遇到了同样的错误。 当我尝试使用new关键字分配空间时发生错误。 如果这个错误是愚蠢的,请原谅我,因为我在过去几个月里没有编程。

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

1 个答案:

答案 0 :(得分:10)

由于C ++的编译模型很奇怪,你无法为模板类非常干净地分离.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

希望这有帮助!