【问题标题】:error C2079: 'Toto::a' uses undefined class 'foo' [duplicate]错误 C2079:“Toto::a”使用未定义的类“foo”[重复]
【发布时间】:2016-01-27 04:55:07
【问题描述】:

我在编译以下代码时遇到错误 C2079,我不明白为什么。类 foo 稍后声明(前向声明)。

class foo;

//template <typename dataType>
class Toto
{
    foo a; //C2079
};

class foo
{
public:
int x;
};

这个问题真正奇怪的是,如果我取消注释“模板行”(在类 Toto 声明之前),错误就会消失。我可以将其用作解决方法,但我不明白这里发生了什么。

根据我得到的第一个反馈,我尝试了以下代码:

class foo;

//template <typename dataType>
class Toto
{
    foo *a; // solve C2079

        void otherFunc()
        {
            a->myFunc(); // C2027
        }
};

class foo
{
public:
int x;
    void myFunc()
    {
    };
};

所以用指针“foo * a”替换“foo a”解决了编译错误。但是添加一个函数及其实现并调用“a->myFunc()”现在会产生“错误 C2027:使用未定义类型 'foo'”。是类似的问题吗?再次“模板”解决它。是的,我使用 MSVC 编译器。

【问题讨论】:

  • 感谢 R Sahu 在此链接上指出我,但并不明显找到。是的,我认为我的案子已经涵盖在那里,我同意它是重复的。也许对 C2079 和 C2027 编译器错误的引用可能会更容易找到。

标签: c++ templates


【解决方案1】:

我不明白为什么

因为要创建一个具有值成员的类,该值成员必须在使用时定义。 (有必要例如计算班级的大小)。如果那是指针或引用,那就没问题了。

这个问题真正奇怪的是,如果我取消注释“模板行”(在类 Toto 声明之前),错误就会消失。

正如 @Angew 指出的,这可能发生在不兼容的编译器上。例如,g++ 输出正确的错误诊断:

main.cpp:7:9: error: field 'a' has incomplete type 'foo'
     foo a;
         ^

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    • 2016-07-25
    • 2019-01-25
    • 1970-01-01
    相关资源
    最近更新 更多