收到错误:
error: no matching function for call to ‘stout::SCGI::SCGI()’
代码:
#include <gtest/gtest.h>
#include <vector>
#include "../../../../stout/cgi/scgi/scgi.hpp"
class SCGITest : public ::testing::Test
{
protected:
int string_length;
std::vector<char> netstring;
stout::SCGI scgi;
public:
SCGITest()
{
const char *c_netstring =
"70:CONTENT_LENGTH\00027\0"
"SCGI\0001\0"
"REQUEST_METHOD\0POST\0"
"REQUEST_URI\0/deepthought\0"
","
"What is the answer to life?";
string_length = 102;
for(int i = 0; i < string_length; ++i)
{
netstring.push_back(c_netstring[i]);
}
// SHOULD CALL stout::SCGI::SCGI(const std::vector<char>&)
this->scgi = stout::SCGI scgi {netstring};
scgi.init();
}
};
TEST_F(SCGITest, NetstringSize)
{
EXPECT_EQ(netstring.size(), string_length);
}
TEST_F(SCGITest, SCGILength)
{
EXPECT_EQ(scgi.get_length(), 70);
}
TEST_F(SCGITest, SCGIContentLength)
{
EXPECT_EQ(scgi.get_header("CONTENT_LENGTH"), "27");
}
TEST_F(SCGITest, SCGIVersion)
{
EXPECT_EQ(scgi.get_header("SCGI"), "1");
}
TEST_F(SCGITest, SCGIRequestMethod)
{
EXPECT_EQ(scgi.get_header("REQUEST_METHOD"), "POST");
}
TEST_F(SCGITest, SCGIRequestURI)
{
EXPECT_EQ(scgi.get_header("REQUEST_URI"), "/deepthought");
}
TEST_F(SCGITest, SCGIRequestBody)
{
EXPECT_EQ(scgi.get_request_body(), "What is the answer to life?");
}
问题:
当我尝试使用构造函数stout::SCGI::SCGI
构造类型为stout::SCGI::SCGI(const std::vector<char>&)
的对象时,它在上面的代码中失败,并显示了此帖子顶部显示的错误消息。
似乎在构造函数完成之前,它已经尝试调用scgi私有成员变量的默认(空)构造函数。我不想在我的课程中使用空构造函数,并且在调查时不得不临时添加一个来修复此问题。
我已经阅读了有关此问题的其他问题,但似乎无法找到针对此特定情况的解决方案。
如果重要的话我正在使用带有-std=c++14
标志的Arch Linux上的G ++ 4.9.2编译上述代码。
答案 0 :(得分:3)
您的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
而不是等待分配给它,那么这就完全消失了。
答案 1 :(得分:1)
scgi
应该在这里是什么?我想你只想要
this->scgi = stout::SCGI {netstring};