为什么我的副本构造函数被删除?

时间:2018-07-11 09:22:32

标签: c++ class c++11 ostream ostringstream

给出以下代码:

#include <iostream>
#include <vector>
#include <cstring>
#include <cassert>
#include <sstream>

using std::string;
using std::ostream;
using std::cout;
using std::endl;

typedef std::basic_ostringstream<char> ostringstream;

class Format { //error1
    const char* str;
    ostream& os;
    int index;
    ostringstream savePrint;
public:
    Format(const char* str, ostream& os) :
            str(str), os(os), index(0) {
    }

    ~Format() {
        os << savePrint.str();
    }

    template<class T>
    Format& operator<<(const T& toPrint) {
        while (index < strlen(str) && str[index] != '%') {
            savePrint << str[index++];
        }
        if (index == strlen(str)) {
            throw std::exception();
        }
        assert(str[index] == '%');
        savePrint << toPrint;
        index++;
        return *this;
    }

};

class TempFormat {
    const char* str;
public:
    TempFormat(const char* str) :
            str(str) {
    }
    friend Format operator<<(ostream& os, TempFormat& f) {
        return Format(f.str, os); //error2
    }
};

TempFormat format(const char* str) {
    return TempFormat(str);
}

int main() {
    int year = 2018;
    string hello = "Hello";
    cout << format("% world! The year is %\n") << hello << year; // error3
}

我收到以下错误:

  

使用删除的函数'std :: __ cxx11 :: basic_ostringstream <_CharT,_Traits,_Alloc> :: basic_ostringstream(const std :: __ cxx11 :: basic_ostringstream <_CharT,_Traits,_Alloc>&)[带有_CharT = char; _Traits = std :: char_traits; _Alloc = std :: allocator]'

并且:

  

使用已删除的函数'Format :: Format(const Format&)'

并且:

  

类型为'TempFormat'的右值的类型为'TempFormat&'的非常量引用的无效初始化

有人可以向我解释为什么我会收到这些错误以及如何解决它们吗?

注意:我希望通过此代码实现printf的版本(与%的连接)。

1 个答案:

答案 0 :(得分:3)

修复:

ScheduleInstagramAccounts::find(1)->log()->create([
    'action_type' => 1,
    'log' => 'test'
]);