Stringstream编译错误仅在linux环境中发生

时间:2018-07-27 16:43:22

标签: c++ linux c++11

我在桌面上使用Visual Studio用C ++编写了一个程序。在这种环境下,程序可以毫无错误地进行编译和执行,并且输出完全符合预期。

但是,当我尝试将源代码移至linux系统并进行编译时,遇到了与使用stringstream有关的错误。该代码具有以下形式:

input

我在整个程序中多次使用了此赋值操作,就像我说的那样-使用Visual Studio进行编译时,没有引起任何问题。在我的Linux系统上,gnu编译器和intel编译器都抛出相同的错误,内容为:

#include <sstream>
#include <string>
using namespace std;

int main() {
    string line;
    stringstream ssline;
    ssline = stringstream(line); //where the error occurs
}

我不知道如何处理此错误,也不知道为什么它似乎与系统有关。我可以重写源代码以避免使用stringstream,但是我不希望这样做。再次因为我知道它可以在我的桌面环境上工作。

我非常感谢您为解决这一难题提供的帮助。 预先感谢。

2 个答案:

答案 0 :(得分:4)

It seems,自GCC 5起,GCC已为std::stringstream分配了移动,而您使用的是GCC 4.8.2。

您的GCC太旧了,您需要升级。

答案 1 :(得分:0)

使用ssline.str(line);可以完成您想要的工作(包括继续使用std::stringstream)。

TL; DR您的代码无法编译,因为stringstream实例不可复制(在您的GCC编译器中,引用@HolyBlackCat的答案)。

看看https://en.cppreference.com/w/cpp/language/copy_assignment。有一个标题为“删除隐式声明的副本分配运算符”的部分。代码中发生的事情是,由于std::stringstream没有赋值运算符,并且您尝试使用它,因此编译器会尝试生成一个赋值运算符。但是,由于std::stringstream实例不可复制,因此隐式声明的运算符被定义为已删除。