1

したがって、おそらく私は信じられないほど愚かなことをしていて、それをキャッチするだけですが、最も明確に定義した関数への未定義の参照を取得し続けています。私の .cpp ファイルの 1 つで、次のコマンドを使用します。

#include "MVec.h"
...
MVec ans;
...
for(int i = 0; i < 3; i++)
    ans[i] = ...

MVec.h には、次のものがあります。

class MVec {
...
inline double & operator[](const int i);
inline const double & operator[](const int i) const;
...
};

最後に、mvec.cpp には次のものがあります。

inline double & MVec::operator[](const int i) {
        #ifdef CHECK_BOUNDS
        if(i < 0 || i >= 3)
                throw("Subscript out of bounds");
        #endif

        return vec[i];
}

inline const double & MVec::operator[](const int i) const {
        #ifdef CHECK_BOUNDS
        if(i < 0 || i >= 3)
                throw("Subscript out of bounds");
        #endif

        return vec[i];
}

ただし、どういうわけか、2 つの .cpp ファイルをコンパイルしてリンクしようとすると、

g++ atommanager.cpp -o atommanager.o
g++ mvec.cpp -o mvec.o
g++ atommanager.o mvec.o -o gpumd

私はいつもエラーが発生します:

atommanager.cpp:(.text+0x76): undefined reference to `MVec::operator[](int)'

ここで、atommanager.cpp は、最初に言及した .cpp ファイルの名前です。

4

1 に答える 1

4

関数を定義inlineしても、外部から見える定義は提供されません。定義は、関数が定義されている翻訳内でのみ表示されます(関数も宣言されていない限り、定義inline後の呼び出しに対してのみ表示されます)。この問題の最も簡単な解決策は、を削除することです。または、ヘッダーで関数を定義する必要があります。inlineinlineinline

于 2012-12-24T00:42:56.627 に答える