无法理解为什么XCode链接器看不到某些方法



经过多年的学习,我刚刚学会了C++。现在我正在尝试实现一个简单的矩阵类,以便从其他类中使用。在GManNickG的带领下,以下是我的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);
}

现在,当我从main中使用SimpleMatrix时,它可以很好地编译、链接和工作。当我试图从声明为(在"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的默认构造函数,但这并不是我真正关心的问题。我只是不明白这两种情况之间的根本区别是什么

非常感谢您的帮助。

模板的实现必须在头文件中。

最新更新