没有默认构造函数和错误

时间:2014-11-29 17:28:00

标签: c++ c++11 c++14

收到错误:

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编译上述代码。

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};