0

私は何年にもわたる意味で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);
}

今、SimpleMatrixfromを使用するmainと、コンパイル、リンク、および正常に動作します。Container(「Container.h」で)として宣言されたオブジェクトから使用しようとすると:

#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 のシンボルが見つかりませんでした。

「Build Phases/Compile Sources」設定を確認しましたが、3 つのファイル (main.cpp、SimpleMatrix.cpp、Container.cpp) がすべてあります。

おそらく、このコードには多くの問題があります。頭に浮かぶのは、 のデフォルト コンストラクターの欠如ですがSimpleMatrix、それはここで私が実際に懸念していることではありません。2つのケースの根本的な違いが何であるかを理解できません。

どんな助けでも大歓迎です。

4

1 に答える 1

2

テンプレートの実装は、ヘッダー ファイルで行う必要があります。

于 2013-02-21T21:03:17.283 に答える