C++ 没有默认构造函数和错误

C++ 没有默认构造函数和错误,c++,c++11,c++14,C++,C++11,C++14,收到错误: error: no matching function for call to ‘stout::SCGI::SCGI()’ 代码: #包括 #包括 #包括“../../../../stout/cgi/scgi/scgi.hpp” 类SCGITest:public::testing::Test { 受保护的: int字符串长度; std::vector netstring; 粗::SCGI-SCGI; 公众: SCGITest() { 常量字符*c_netstring= “70:内

收到错误:

error: no matching function for call to ‘stout::SCGI::SCGI()’
代码:

#包括
#包括
#包括“../../../../stout/cgi/scgi/scgi.hpp”
类SCGITest:public::testing::Test
{
受保护的:
int字符串长度;
std::vector netstring;
粗::SCGI-SCGI;
公众:
SCGITest()
{ 
常量字符*c_netstring=
“70:内容长度\u\00027\0”
“SCGI\0001\0”
“请求\u方法\0POST\0”
“请求\u URI\0/Deepthink\0”
","
“生活的答案是什么?”;
字符串长度=102;
对于(int i=0;iscgi=stout::scgi-scgi{netstring};
scgi.init();
}
};
测试(SCGITest、NetstringSize)
{
EXPECT_EQ(netstring.size(),字符串长度);
}
测试F(SCGITest、SCGILength)
{
EXPECT_EQ(scgi.get_length(),70);
}
测试F(SCGITest、SCGIContentLength)
{
EXPECT_EQ(scgi.get_头(“内容长度”),“27”);
}
测试F(标准测试、标准化)
{
EXPECT_EQ(scgi.get_头(“scgi”),“1”);
}
测试F(SCGITest,SCGIRequestMethod)
{
EXPECT_EQ(scgi.get_头(“请求方法”),“POST”);
}
测试(SCGITest、SCGIRequestURI)
{
EXPECT_EQ(scgi.get_头(“请求URI”),“/deepthink”);
}
测试F(SCGITest、SCGIRequestBody)
{
期待你的情商(scgi.get\u request\u body(),“生活的答案是什么?”;
}
问题:

当我尝试使用构造函数
stout::SCGI::SCGI::SCGI
构造类型为
stout::SCGI::SCGI(const std::vector&)
的对象时,在上述代码中失败,错误消息显示在本文顶部

在构造函数完成之前,它似乎已经尝试调用scgi私有成员变量的默认(空)构造函数。我不想在我的类上有一个空的构造函数,在我调查时,我不得不临时添加一个来修复这个问题

我已经阅读了关于这个问题的其他问题,但似乎找不到解决这个问题的办法


如果重要的话,我在Arch Linux上使用G++4.9.2编译上面的代码,带有
-std=c++14
标志。

这里应该是什么
scgi
?我想你只是想

this->scgi = stout::SCGI {netstring};

什么是
scgi
应该在这里?我想你只是想

this->scgi = stout::SCGI {netstring};

您的
stout::SCGI
类型没有默认构造函数,但您没有初始化
this->SCGI
。当然,您在构造函数体的末尾为它赋值,但这完全不是一回事

您需要初始化
const
或无法默认构造的任何成员:

struct Foo
{
   stout::SCGI scgi;

   Foo()
     : scgi(/* ctor arguments here */)   // this is a "member initialisation list"
   {};
};

此外,以下语法完全无效:

this->scgi = stout::SCGI scgi {netstring};
单独的scgi显然是多余的。充其量,你想要:

this->scgi = stout::SCGI{netstring};

但是,一旦您初始化
this->scgi
而不是等待分配给它,那么它就会完全消失。

您的
stout::scgi
类型没有默认构造函数,但您没有初始化
this->scgi
。当然,您在构造函数体的末尾为它赋值,但这完全不是一回事

您需要初始化
const
或无法默认构造的任何成员:

struct Foo
{
   stout::SCGI scgi;

   Foo()
     : scgi(/* ctor arguments here */)   // this is a "member initialisation list"
   {};
};

此外,以下语法完全无效:

this->scgi = stout::SCGI scgi {netstring};
单独的scgi显然是多余的。充其量,你想要:

this->scgi = stout::SCGI{netstring};

然而,一旦你初始化
this->scgi
而不是等待分配给它,它就会完全消失。

这与谷歌测试无关<代码>scgi(netstring)尝试使用参数
netstring
调用函数
scgi
。当
scgi
既不是函数,也不是类似函数的东西时,这显然不起作用。@hwd-Ah。能不能提供一个答案和一个解决方案,这样我就可以投票给你,并将问题标记为已回答?我没有将其作为答案发布,因为我没有答案。现在,我只能告诉你问题是什么,而不能告诉你如何解决问题。@hwd我已经更新了问题,删除了错误的google测试内容,并修复了你在第一条评论中提到的特定问题。我还更新了一条错误消息,当它被修复时会显示出来。为什么不使用mem初始值设定项列表呢
SCGITest():scgi(netstring){…}
这与谷歌测试无关<代码>scgi(netstring)尝试使用参数
netstring
调用函数
scgi
。当
scgi
既不是函数,也不是类似函数的东西时,这显然不起作用。@hwd-Ah。能不能提供一个答案和一个解决方案,这样我就可以投票给你,并将问题标记为已回答?我没有将其作为答案发布,因为我没有答案。现在,我只能告诉你问题是什么,而不能告诉你如何解决问题。@hwd我已经更新了问题,删除了错误的google测试内容,并修复了你在第一条评论中提到的特定问题。我还更新了一条错误消息,当它被修复时会显示出来。为什么不使用mem初始值设定项列表呢
SCGITest():scgi(netstring){…}
谢谢,这解决了问题。我想我应该更多地使用初始化列表。我被构造函数调用默认构造函数的事实所吸引,除非您在初始化器列表中提供自己的初始化。@Cromulent:必须以某种方式构造成员!除非给出参数,否则只能使用默认构造函数。谢谢,这解决了问题。我想我应该更多地使用初始化列表。我被构造函数调用默认构造函数的事实所吸引,除非您在初始化器列表中提供自己的初始化。@Cromulent:必须以某种方式构造成员!除非为其提供参数,否则只能使用默认构造函数。