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'使用未定义的结构'git_repository'”。结构实际上并不是未定义的,因为如果我使用指向结构的指针而不是结构本身......

git_repository * gitRepo;

...它编译得很好。

git_repository 的类型声明如下:

typedef struct git_repository git_repository;

我 grepped 了整个包含树,这是代码中唯一的 typedef 或 struct 定义。这是否表明实际的结构定义隐藏在实际的库实现中,但不包含在标头中?

4

2 回答 2

7

因为编译器将其git_repository视为Incomplete type
编译器看不到结构的定义,git_repository因此将其视为不完整类型。这意味着您不能要求编译器执行任何需要编译器知道结构大小或布局的操作。您仍然可以声明指向该结构的指针,因为指向结构的指针始终具有相同的大小,而不管它是哪种结构。

如果您需要创建结构的实例,编译器必须查看结构的定义,并且您必须包含定义类型的标头。

于 2013-02-14T14:46:08.407 回答
3

即使类型不完整,您也可以声明指向的指针即,如果您只提供了它的声明,但没有提供定义),因为指针的大小不依赖于的大小并且只要您不访问通过该指针的成员(这里就是这种情况,因为您只声明了一个类型为 的变量),编译器不需要对.TTTTT*T

但是,如果不完整,则不能声明类型变量,因为编译器需要知道 的大小,为此它需要查看的定义。TTTT

于 2013-02-14T14:44:56.313 回答