为什么类中的stringstream成员导致编译时错误?

时间:2019-02-19 16:37:47

标签: c++

每当我尝试使用以下类运行程序时,都会出现与std :: stringstream newPredicate的声明链接的错误。一旦删除该声明(及其在源代码中的任何使用),该错误就会消失。

#ifndef LAB1_PREDICATE_H
#define LAB1_PREDICATE_H
#include <sstream>



class Predicate {
private:
public:
    std::stringstream newPredicate;
    void addToString(std::string tokenValue);
    void clearString();
   std::string toString();
};


#endif //LAB1_PREDICATE_H

下面是标题的源代码。我将stringstream设置为类成员,因此我可以通过任何函数进行访问。

#include "Predicate.h"

void Predicate::addToString(std::string tokenValue) {
    newPredicate << tokenValue;
}

void Predicate::clearString() {
    newPredicate.clear();
}

std::string Predicate::toString() {
    std::string predicateString;
    newPredicate >> predicateString;
    return predicateString;
}

我在另一个类中多次调用谓词对象。用所需的字符串值填充它后,将其推入向量并清除它。

std::vector<Predicate> myVector;
Predicate myPredicate;
myPredicate.addToString(myString); //I call this function a few times
myVector.push_back(myPredicate);
myPredicate.clearString();

这是错误消息

error: use of deleted function 'Predicate::Predicate(const Predicate&)'
{ ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }
  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

然后是一个音符

note: 'Predicate::Predicate(const Predicate&)' is implicitly deleted because 
the default definition would be ill-formed:
class Predicate {
      ^~~~~~~~~

1 个答案:

答案 0 :(得分:2)

std::stringstream是不可复制的,因此未定义Predicate类的默认复制构造函数。

大概是您在代码中的某个位置试图复制Predicate对象。您需要从std::stringstream中删除Predicate,定义自己的副本构造函数,或者不复制Predicate对象。