错误C2079:' Toto :: a'使用未定义的类' foo'

时间:2015-10-27 16:45:06

标签: c++ templates

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

class foo;

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

class foo
{
public:
int x;
};

在这个问题上真正奇怪的是,如果我取消注释&#34;模板行&#34; (课前托托宣言),错误消失。我可以用它作为解决方法,但我不明白这里发生了什么。

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

class foo;

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

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

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

所以更换&#34; foo a&#34;用指针&#34; foo * a&#34;解决编译错误。但是通过它的实现添加一个函数并调用&#34; a-&gt; myFunc()&#34;现在正在产生&#34;错误C2027:使用未定义的类型&#39; foo&#39;&#34;。是类似的问题吗?再次&#34;模板&#34;解决这个问题。是的,我使用的是MSVC编译器。

1 个答案:

答案 0 :(得分:3)

  

我不明白为什么

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

  

在这个问题上真正奇怪的是,如果我取消注释&#34;模板行&#34; (在课前Toto声明),错误消失。

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

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