c++ - C++ 链接步骤中的 undefined reference 错误

标签 c++ class compilation linker header-files

<分区>

我正在尝试用 C++ 制作一个简单的边界检查数组。我在头文件中声明了一个类,并在单独的源文件中定义了该类。编译步骤运行良好,但是当我尝试链接对象时,出现以下错误:

$ g++.exe -o a.exe src\main.o src\array.o
src\main.o: In function `main':
../src/main.cpp:7: undefined reference to `Array<int>::Array(int)'
../src/main.cpp:9: undefined reference to `Array<int>::operator[](int)'
../src/main.cpp:10: undefined reference t o `Array<int>::operator[](int)'
../src/main.cpp:11: undefined reference t o `Array<int>::operator[](int)'
../src/main.cpp:13: undefined reference t o `Array<int>::operator[](int)'
../src/main.cpp:7: undefined reference to `Array<int>::~Array()'
../src/main.cpp:7: undefined reference to `Array<int>::~Array()'
collect2.exe: error: ld returned 1 exit status

主要.cpp

#include <iostream>
#include "array.hpp"

using namespace std;

int main() {
  Array<int> x(10); // compiler error

  x[0] = 1; // compiler error
  x[1] = 2; // compiler error
  x[2] = 3; // compiler error

  cout << x[1] << endl; // compiler error

  return 0;
}

数组.hpp

#ifndef ARRAY_HPP_
#define ARRAY_HPP_

template <class T>
class Array{
private:
  T* array;
  int length_;
public:
  Array(int);
  ~Array();
  int Length();
  int& operator[](int);
};

#endif /* ARRAY_HPP_ */

数组.cpp

#include "array.hpp"

template <class T>
Array<T>::Array(int size) {
  length_ = size;
  array = new T[size];
}

template <class T>
Array<T>::~Array() {
  delete[] array;
}

template <class T>
int Array<T>::Length() {
  return length_;
}

template <class T>
int& Array<T>::operator[](const int index) {
  if (index < 0 || index >= length_) {
    throw 100;
  }
  return array[index];
}

最佳答案

模板类成员的定义应在模板类本身定义的同一 header 中。

关于c++ - C++ 链接步骤中的 undefined reference 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27080588/

相关文章:

css - 我可以在 css 中创建默认类吗?

java - Java 的 CSS 类

java - 嵌套类

c - 用 C 编写的程序无限循环或在一段时间后崩溃

c++ - 在编译时填充 std::set?

c++ - Jenkins 和 cFix 单元测试 (C++)

c++ - c++中的for循环迭代

c++ - 运行时符号查找错误

C++解析比特流

C++编译错误: has initializer but incomplete type