【问题标题】:linker stage: undefined reference链接器阶段:未定义的引用
【发布时间】:2011-07-12 16:03:43
【问题描述】:

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

【问题讨论】:

  • 您使用不推荐使用的标头有什么特殊原因吗?
  • 我不敢相信在 15 次关于“未定义引用”错误的讨论中,没有一个讨论过您的特定问题。这很常见,应该出现在最初的几个点击中。

标签: c++ class reference undefined


【解决方案1】:

你把你的模板函数放在头文件里了吗?

所以 template <class T> void Multi1<T>::set(T val, int32_t pos) { m_data[pos] = val; }

应该在你的 multi.h 头文件中。

【讨论】:

  • 是的。请参阅cplusplus.com/forum/beginner/32577 - 基本上,编译器需要知道模板参数将使用哪些类型进行实例化,因此此信息必须在链接之前可用。
  • 这是修复它的唯一方法,通过将所有方法推送到标题或什么?
  • @fearlesstost 现在这是一个有用的答案,你!
  • @drahnr:是的,这是唯一明智的解决方案。模板不是代码,它们是代码生成工具。但是,您必须编译实际代码,因此您必须提供实际 模板实例 的定义。理论上您可以将显式实例化到一个单独的源文件中,但这会相当混乱。
【解决方案2】:

你在哪里定义的?

Multi1<voCam*>::operator[](int) const

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

【讨论】:

  • 这不是答案。 (不过,如果有适当的免责声明,它可能是一个很好的修辞!)
  • @Tomalak Geret'kal:起初我没有注意到确实有一个定义,因此认为这是问题所在。无论如何,我已经修改了它,就像我注意到有一个一样。
猜你喜欢
  • 2021-10-22
  • 2010-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多