我正在组建一个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整个include树,这是代码中唯一的typedef或struct定义。这是否表明实际的struct定义隐藏在实际的库实现中,但不包含在头文件中?
答案 0 :(得分:7)
因为编译器将git_repository
视为不完整类型
编译器无法查看结构git_repository
的定义,因此它将其视为不完整类型。这意味着您不能要求编译器执行任何需要编译器知道结构大小或布局的操作。您仍然可以声明指向结构的指针,因为指向结构的指针总是具有相同的大小,而不管它是哪种结构。
如果您需要创建结构实例,编译器必须查看结构的定义,必须包含定义类型的标头。
答案 1 :(得分:3)
即使类型T
不完整(即,如果您只提供了声明),您 可以向<{1}}声明指针 ,但不是定义),因为指针的大小不依赖于T
的大小,只要你不通过该指针访问T
的成员(这是这里的情况,因为您只声明了T
类型的变量,编译器不需要具有关于T*
的任何特定知识。
但是,如果T
不完整,不能声明类型T
的变量,因为编译器需要知道T
的大小,并且它需要看T
的定义。