0

今週、私は知識を C から C++ にアップグレードし始めました。いくつかの演算子をオーバーロードしたいと思います。

Matrixというクラスがあります

#include "lcomatrix.h"

inline Matrix::Matrix(unsigned rows, unsigned cols) :
        rows_(rows), cols_(cols)
{
        data_ = new double[rows * cols];
}

inline Matrix::~Matrix() {
    delete[] data_;
}

inline double& Matrix::operator()(unsigned row, unsigned col) {
    return data_[cols_ * row + col];
}

inline double Matrix::operator()(unsigned row, unsigned col) const {
    return data_[cols_ * row + col];
}

の内容lcomatrix.h

#include <iostream>

class Matrix {
public:
    Matrix(unsigned rows, unsigned cols);
    double& operator()(unsigned row, unsigned col);
    double operator()(unsigned row, unsigned col) const;

    ~Matrix(); // Destructor        
    Matrix& operator=(Matrix const& m); // Assignment operator      

private:
    unsigned rows_, cols_;
    double* data_;
};

メイン.cpp

#include "lcomatrix.h"
#include <iostream>


/*-
 * Application entry point.
 */
int main(void) {

    Matrix mx(12,12);

    //std::cout << mx << std::endl;

    return 0;
}

メイクファイル:

CPPFLAGS=-I /path/lcomatrix/
EFLAGS=

all : main.o lcomatrix.o
    g++ $(EFLAGS) -o main.out  main.o lcomatrix.o 

main.o: lcomatrix.o
    g++ $(EFLAGS) $(CPPFLAGS) -c main.cpp

lcomatrix.o: 
    g++ $(EFLAGS) -c /home/robu/UbuntuOne/ChibiOS-RPi/lcomatrix/lcomatrix.cpp

clean:
    rm *.o main.out 

ビルドしようとすると、次のリンク エラーが表示されます。

make all 
g++  -c /home/robu/UbuntuOne/ChibiOS-RPi/lcomatrix/lcomatrix.cpp
g++  -I /home/robu/UbuntuOne/ChibiOS-RPi/lcomatrix/ -c main.cpp
g++  -o main.out  main.o lcomatrix.o 
main.o: In function `main':
main.cpp:(.text+0x1b): undefined reference to `Matrix::Matrix(unsigned int, unsigned int)'
main.cpp:(.text+0x2c): undefined reference to `Matrix::~Matrix()'
collect2: error: ld returned 1 exit status
make: *** [all] Error 1

これは本当にばかげたエラーだと思いますが、初心者として解決策がわかりませんでした。

4

1 に答える 1

5

メソッド定義はすべてinlineです。関数をインライン化するために、コンパイラは、それを使用するコードをコンパイルするたびにその定義を確認する必要があります。

関数定義を使用時に見える場所 (ヘッダー、または Main.cpp に含まれる別のファイル) に配置するか、インラインとしてマークしないでください。

于 2012-11-20T21:33:40.867 に答える