错误:有初始化程序但类型不完整

时间:2010-11-26 17:32:42

标签: c++

我遇到了问题:使用struct时有初始化程序但类型不完整:

在hpp文件中:

class A
{
private:
   struct videoDT;
};

在cpp文件中:

struct A::videoDT
{
  videoDT(int b) : a(b){}

  int a;
};

void test()
{
   struct videoDT test(1);
}

然后我遇到了问题:

错误:有初始化程序但类型不完整

提前致谢

3 个答案:

答案 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::videoDTA中是私有的,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>