-2

次のコードがあります。

IFile.h

class IFile
{
public:
    IFile();
    ~IFile(void);

    inline bool IsValidFileType() const;
};

IFile.cpp

IFile::IFile()
{
    //IsValidFileType();
}

IFile::~IFile(void)
{
}

inline bool IFile::IsValidFileType() const
{
          return true;
}

main.cpp

int main(int argc, char* argv[])
{
    IFile* pFile = new IFile();
    pFile->IsValidFileType();

    return 0;
}

コードをコンパイルすると、次のエラーが発生します: error LNK2019: unresolved external symbol "public: bool __thiscall IFile::IsValidFileType(void)const " (?IsValidFileType@IFile@@QBE_NXZ) referenced in function _main

関数の「インライン」または「コンスト」修飾子を変更するか、コンストラクター内で呼び出すと、プログラムはコンパイルされます。この振る舞いを説明していただけますか?

4

4 に答える 4

0

コンパイラは、コンパイル中にコードを表示できない関数をどのようにインライン化できますか?コンパイル時main.cppに、コンパイラはこれを実行するように求められます。

于 2013-03-01T14:44:28.330 に答える
0

インライン関数のコードは、それを参照する各変換単位にコンパイルされます(結局のところ、これがアイデアです)。つまり、ヘッダーファイルにコードを含める必要があります。

于 2013-03-01T14:44:33.700 に答える
0

キーワードはinline、それが使用されている各翻訳単位 (*.cpp ファイル) で定義を確認できることをコンパイラに約束します。main.cpp には IFile.h が含まれていますが、定義を参照できないため、この約束を破ることになります。

通常、inlineキーワードを持つ関数は、ソース ファイルではなく、ヘッダー ファイルで定義する必要があります。

于 2013-03-01T14:45:08.753 に答える
0

関数はインラインであるため、ファイルではなくヘッダー ファイルで定義する必要がありcppます。

于 2013-03-01T14:45:28.977 に答える