链接器阶段:未定义的引用

时间:2011-07-12 16:03:44

标签: c++ class reference undefined

我已经在这里阅读了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

2 个答案:

答案 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

好的,你拥有它,你应该在同一个头文件中有模板声明和定义。