我有一个项目,我需要扩展一些功能而不涉及我正在使用的项目。
问题的核心是这个(我愚蠢了,但核心应该清楚)。
//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::)。更新了编译器错误
答案 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){}
};
'重载'缺少的构造函数(我无法自己填写。
问题解决了:))