This question already has answers here:
Why should the implementation and the declaration of a template class be in the same header file? [duplicate]
(4个答案)
已关闭6年。
经过数年的努力,我才开始学习C ++。现在,我正在尝试实现一个简单的矩阵类,以供其他类使用。在GManNickG's lead之后,这是我的
并实现为(在“ SimpleMatrix.cpp”中):
现在,当我使用
并实现为(在“ Container.cpp”中):
Xcode抱怨
架构x86_64的未定义符号:
ld:找不到架构x86_64的符号clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)
我已经检查了“构建阶段/编译源”设置,并且所有三个文件都存在(main.cpp,SimpleMatrix.cpp和Container.cpp)。
此代码可能存在许多问题。我想到的是缺少
任何帮助是极大的赞赏。
(4个答案)
已关闭6年。
经过数年的努力,我才开始学习C ++。现在,我正在尝试实现一个简单的矩阵类,以供其他类使用。在GManNickG's lead之后,这是我的
SimpleMatrix
(在“ SimpleMatrix.h”中声明):#pragma once
#include <vector>
template <typename T>
class SimpleMatrix {
unsigned int numCols, numRows;
public:
std::vector<T> data;
SimpleMatrix(unsigned int cols, unsigned int rows) :
numCols(cols),
numRows(rows),
data(numCols * numRows)
{};
T getElement(unsigned int column, unsigned int row);
void setShape(unsigned int column, unsigned int row, const T& initValue);
};
并实现为(在“ SimpleMatrix.cpp”中):
#include "SimpleMatrix.h"
template <class T>
T SimpleMatrix<T>::getElement(unsigned int column, unsigned int row) {
return data[row * numCols - 1];
}
template <class T>
void SimpleMatrix<T>::setShape(unsigned int columns, unsigned int rows, const T& initValue) {
numCols = columns;
numRows = rows;
data.assign(columns * rows, initValue);
}
现在,当我使用
SimpleMatrix
中的main
时,它可以编译,链接并可以正常工作。当我尝试从声明为(在“ Container.h”中)的对象Container
使用它时:#include "SimpleMatrix.h"
class Container {
public:
SimpleMatrix<int> matrix;
Container();
void doStuff();
};
并实现为(在“ Container.cpp”中):
#include "Container.h"
#include "SimpleMatrix.h"
void Container::doStuff() {
this->matrix.setShape(2, 2, 0);
this->matrix.getElement(1, 1);
}
Xcode抱怨
架构x86_64的未定义符号:
"SimpleMatrix<int>::getElement(unsigned int, unsigned int)", referenced from:
Container::doStuff() in Container.o
"SimpleMatrix<int>::setShape(unsigned int, unsigned int, int const&)", referenced from:
Container::doStuff() in Container.o
ld:找不到架构x86_64的符号clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)
我已经检查了“构建阶段/编译源”设置,并且所有三个文件都存在(main.cpp,SimpleMatrix.cpp和Container.cpp)。
此代码可能存在许多问题。我想到的是缺少
SimpleMatrix
的默认构造函数,但这并不是我真正关心的。我只是不明白这两种情况之间的根本区别是什么。任何帮助是极大的赞赏。
最佳答案
模板的实现必须在头文件中。
10-08 17:06