1

C++ クラスを作成していますが、修正できるエラーが発生しましたが、よくわかりません。

次のヘッダー (main.h) を使用しようとしています。

#include <git2.h>

class Test
{    
public:
private:
    git_repository gitRepo;
};

および次のファイル (main.cpp):

#include "main.h"

int main(int argc, char *argv[]){
    Test test;
}

しかし、それは私に「Test::gitRepo' uses undefined struct 'git_repository'」を与えています。ただし、構造体自体の代わりに構造体へのポインターを使用すると、構造体は実際には未定義ではありません...

git_repository * gitRepo;

...それはうまくコンパイルされます。

git_repository の型宣言は次のとおりです。

typedef struct git_repository git_repository;

インクルード ツリー全体を grep しましたが、それがコード内の唯一の typedef または struct 定義です。これは、実際の構造体定義が実際のライブラリ実装内に隠されているが、ヘッダーには含まれていないことを示唆していますか?

4

2 に答える 2

7

コンパイラは不完全な型git_repositoryとして認識しているためです。 コンパイラは構造体の定義を認識できないため、不完全な型として扱います。これは、構造体のサイズまたはレイアウトを知る必要がある操作をコンパイラーに実行させることができないことを意味します。構造体へのポインターは、構造体に関係なく常に同じサイズであるため、構造体へのポインターを宣言することもできます。
git_repository

構造体のインスタンスを作成する必要がある場合、コンパイラは構造体の定義を確認する必要があり、型を定義するヘッダーを含める必要があります。

于 2013-02-14T14:46:08.407 に答える
3

型が不完全であっても(つまり、その宣言のみを提供し、定義を提供していない場合)へのポインターを宣言できます。そのポインターを介してのメンバー(ここでは、 type の変数のみを宣言するため) の場合、コンパイラーは についての特定の知識を必要としません。TTTTT*T

ただし、が不完全な場合、型の変数を宣言することはできません。これは、コンパイラが のサイズを知る必要があり、そのためにの定義を確認する必要があるためです。TTTT

于 2013-02-14T14:44:56.313 に答える