我已经在这里阅读了15个未定义的参考主题,并且也使用谷歌找到了有效的答案,但是有非真的帮助。
我写了一个1D和2D简单存储类,它允许通过直接访问数据(加上一些方便的访问器)来快速循环。这里1D去(2D几乎相同,只是2D)
部首:
#ifndef MULTI1_H
#define MULTI1_H
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
template <class T>
class Multi1
{
public:
Multi1(int32_t size_ = -1);
~Multi1();
void set(T val, int32_t pos);
T& operator[] (int32_t pos) const;
T& at(int32_t pos) const;
int32_t m_size;
T *m_data;
};
#endif // MULTI1_H
体:
#include "multi1.h"
template <class T>
Multi1<T>::Multi1(int32_t size_) :
m_size(size_),
m_data(NULL)
{
if (size_>0)
m_data = (T *) malloc (sizeof(T)*size_);
else
m_size = 0;
}
template <class T>
Multi1<T>::~Multi1()
{
if (m_data!=NULL)
free (m_data);
}
template <class T>
void Multi1<T>::set(T val, int32_t pos)
{
m_data[pos] = val;
}
template <class T>
T& Multi1<T>::operator[](int32_t pos) const
{
return m_data[pos];
}
template <class T>
T& Multi1<T>::at(int32_t pos) const
{
return m_data[pos];
}
./build/main.o: In function `setupDemo(Multi1<voCam*>&, Multi1<voBoard*>&, Multi2<voBoardObservation*>&)':
./src/main.cpp:32: undefined reference to `Multi1<voCam*>::operator[](int) const'
./src/main.cpp:31: undefined reference to `Multi1<voCam*>::operator[](int) const'
./src/main.cpp:30: undefined reference to `Multi1<voBoard*>::operator[](int) const'
./src/main.cpp:29: undefined reference to `Multi1<voBoard*>::operator[](int) const'
./src/main.cpp:41: undefined reference to `Multi1<voCam*>::operator[](int) const'
....
我检查了包括5次,我最近已经习惯了C编程,我可以保留像我的脖子上的链接器仇杀这样的东西。
注意:我正在使用g ++进行编译,链接器标志为-lstdc++ -lm
答案 0 :(得分:4)
您是否将模板功能放在头文件中?
所以
template <class T>
void Multi1<T>::set(T val, int32_t pos)
{
m_data[pos] = val;
}
应该在你的multi.h头文件中。
答案 1 :(得分:0)
你在哪里定义?
Multi1<voCam*>::operator[](int) const
好的,你拥有它,你应该在同一个头文件中有模板声明和定义。