无法使用在不同头文件中定义的struct

时间:2015-02-05 11:23:22

标签: c++ struct header

我有一个项目,我需要扩展一些功能而不涉及我正在使用的项目。

问题的核心是这个(我愚蠢了,但核心应该清楚)。


//Layout.h
#ifndef LAYOUT_H
#define LAYOUT_H

#include "Speaker.h"

class Layout
{
    public:
        //unrelated stuff
    private:
        LSS::Speaker temp;
};
#endif

//Speaker.h"
#ifndef SPEAKER_H
#define SPEAKER_H
namespace LSS
{
    struct Speaker
    {
        Speaker(int val1, float val2)
        :some_int(val1)
        , some_float(val2)
        {
        }

        ~Speaker()    
        {
            //do other stuff
        }

         int some_int;
         float some_float;

    };//struct Speaker
}
#endif

我只是希望能够在" Layout.h"中使用struct Speaker(在" Speaker.h"中定义)。没有触及" Speaker.h"

如果我编译,我会收到以下错误:

  

错误22错误C2512:' LSS ::扬声器' :没有合适的默认构造函数>可用Layout.cpp 7 1 MyProj

我认为包装起来 - 任何帮助都会受到赞赏,我对c ++很陌生

编辑:在重新创建问题时,我制作了一个TYPO(LSS:而不是LSS::)。更新了编译器错误

3 个答案:

答案 0 :(得分:1)

仔细阅读消息

  

错误3错误C2146:语法错误:缺少';'在标识符'temp'之前> Layout.h 102 1

然后将LSS:Speaker temp;更改为LSS::Speaker temp;

修改

错误

  

错误22错误C2512:'LSS :: Speaker':没有合适的默认构造函数>可用Layout.cpp 7 1 MyProj

如果您为Speaker提供至少一个带参数的构造函数,则还必须提供默认构造函数(不带参数的构造函数)以使LSS::Speaker temp;有效。这是一个规则(对于程序员编译器编写没有构造函数的情况下的默认构造函数,但如果程序员开始更改构造逻辑,编译器在这部分工作中什么都不做)。

或者您可以在现有构造函数中提供默认值,如下所示:

  Speaker(int val1 = 0, float val2 = 0.0f)
        :some_int(val1)
        ,some_float(val2)
  {
  }

答案 1 :(得分:0)

要回答新问题,现在已将其更改为使之前的答案无效:

  

'LSS :: Speaker':没有合适的默认构造函数

如错误消息所示,该类没有默认构造函数,因此只能通过提供构造函数参数来实例化它。您可能希望在Layout构造函数中执行此操作,例如:

Layout() : temp(some_value, some_other_value) {} 

答案 2 :(得分:0)

我想出了如何解决Layouts.h没有默认构造函数(请记住:在这种情况下我不允许编辑Speaker()结构)

在Layout.h中我定义了

class Speaker: public LSS::Speaker
{
    public:
        Speaker(): LSS::Speaker(-1, 0.0f){}
};

'重载'缺少的构造函数(我无法自己填写。

问题解决了:))