我遇到了问题:使用struct时有初始化程序但类型不完整:
在hpp文件中:
class A
{
private:
struct videoDT;
};
在cpp文件中:
struct A::videoDT
{
videoDT(int b) : a(b){}
int a;
};
void test()
{
struct videoDT test(1);
}
然后我遇到了问题:
错误:有初始化程序但类型不完整
提前致谢
答案 0 :(得分:5)
我认为问题是test()
无法访问A
的私有类型。
这为我编译:
class A
{
private:
friend void test();
struct videoDT;
};
struct A::videoDT
{
videoDT(int b) : a(b){}
int a;
};
void test()
{
A::videoDT test(1);
}
答案 1 :(得分:3)
在test
函数中,您声明了本地类型struct videoDT
,但从未定义它。不令人惊讶的是,编译器抱怨初始化类型不完整的对象。故事结束。
您是如何期待它的?如果您希望声明使用A::videoDT
类型,那么您应该使用类型的限定名称 - A::videoDT
- 因为这就是调用该类型的类型。但是,代码无论如何都不会编译,因为A::videoDT
在A
中是私有的,test
无法访问它。
换句话说,很难弄清楚你想要做什么。提供一些更有意义的解释或代码。
答案 2 :(得分:0)
当编译器处理.hpp文件时,它需要推断出类A的内存占用和布局。因此,它需要知道struct videoDT的内存布局。
错误是编译器抱怨它不知道struct videoDT
是什么,因为你在.cpp文件中定义它。
要解决此错误,您需要在原始.hpp之前包含的.hpp文件中定义struct
。或者,您可以使用pimpl习语并将class A
更改为:
class A
{
private:
struct videoDT* pVideoDT;
}
如果你这样做,那么你不再需要在头文件中定义结构只是为了编译A类。但是,pimpl习惯用法是一种先进的技术,我建议在决定使用之前阅读它。< / p>