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:必须以某种方式构造成员!除非为其提供参数,否则只能使用默认构造函数。