为啥类中的 stringstream 成员会导致编译时错误? [复制]

Posted

技术标签:

【中文标题】为啥类中的 stringstream 成员会导致编译时错误? [复制]【英文标题】:Why is stringstream member in class causing a Compile-time error? [duplicate]为什么类中的 stringstream 成员会导致编译时错误? [复制] 【发布时间】:2019-02-19 16:37:47 【问题描述】:

每当我尝试使用以下类运行我的程序时,都会收到与 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;

我在另一个类中多次调用 Predicate 对象。在我用想要的字符串值填充它之后,我将它推入一个向量并清除它。

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 
      ^~~~~~~~~

【问题讨论】:

你是如何实例化和使用Predicate的? 仅供参考,这是一个编译时错误,而不是运行时错误 这不是运行时错误,您显示的代码也不会导致此编译器错误。至少不是自己。无论如何,问题只是您无法复制流。 我敢打赌有更多的注释,也许有人会提到这一点,但问题是std::stringstream 无法复制,因此编译器无法生成有效的复制构造函数。 创建一个minimal reproducible example。 【参考方案1】:

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

大概在您的代码中的某个地方,您正试图复制一个Predicate 对象。您要么需要从 Predicate 中删除 std::stringstream,要么定义自己的复制构造函数,要么不复制 Predicate 对象。

【讨论】:

如前所述,操作需要显示,该类是如何使用的。

以上是关于为啥类中的 stringstream 成员会导致编译时错误? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能访问静态多态派生类中的受保护成员?

为啥在单个语句中分配动态对象的成员变量会导致 PHP 中的语法错误?

为啥 std::stringstream 在静态内联时不能默认构造?

C#访问派生类中的受保护成员[重复]

为啥我在 IDisposable 类中获得带有私有成员 IDisposable 的 CA2000?

在模板派生类中,为啥我需要在成员函数中使用“this->”来限定基类成员名称?