我在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
对于可能出现问题的任何想法都会非常感激!
干杯!
答案 0 :(得分:4)
答案 1 :(得分:4)
您需要在.hpp文件中包含该实现。编译器需要在编译时知道T以生成特化。
答案 2 :(得分:1)
您不能将模板化代码放入单独的.cpp文件中......您的构造函数应该位于ArrayList标头中。关键是只有当main()
被编译时,编译器才意识到它需要实例化ArrayList以及T将采用什么类型,因此它需要有可用的代码来进行实例化....