在C ++中使用模板的问题

时间:2011-04-25 09:47:12

标签: c++ templates generics

我在C ++中第一次使用模板,并在尝试编译时遇到问题。基本上尝试创建自己的基本ArrayList:

.hpp:

#ifndef ARRAYLIST_HPP_
#define ARRAYLIST_HPP_

template <class T>
class ArrayList
{
    private:
        int current, top ;
        T * al ;

    public:
        ArrayList() ;   // default constructor is the only one
};

#endif /* ARRAYLIST_HPP_ */

.cpp:

#include "ArrayList.hpp"

using namespace std ;

//template <class T>
//void memoryAllocator( T * p, int * n ) ; // private helper functions headers

template <class T>
ArrayList<T>::ArrayList()
{
    current = 0 ;
    top = 10 ;
    al = new T[top] ;
}

主要:

#include "ArrayList.hpp"

int main()
{
    ArrayList<int> test ;
}

当我尝试在没有main的情况下进行构建时,它编译得很好,但是,一旦我尝试在main中使用它,我就会收到以下错误:

Undefined symbols for architecture x86_64:
  "ArrayList<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::ArrayList()", referenced from:
      _main in Website.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
make: *** [APProject2] Error 1

对于可能出现问题的任何想法都会非常感激!

干杯!

3 个答案:

答案 0 :(得分:4)

模板需要在标题中声明

另外:我认为这不是真正的错误。它提到了ArrayList<std::string>的实例化,我无处可见。

This FAQ entry解释了原因。

答案 1 :(得分:4)

您需要在.hpp文件中包含该实现。编译器需要在编译时知道T以生成特化。

答案 2 :(得分:1)

您不能将模板化代码放入单独的.cpp文件中......您的构造函数应该位于ArrayList标头中。关键是只有当main()被编译时,编译器才意识到它需要实例化ArrayList以及T将采用什么类型,因此它需要有可用的代码来进行实例化....