Istream参考基于条件

时间:2017-12-16 17:32:56

标签: c++

我怎么能在C ++中做这样的事情?

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

string input_filename_ = "";

istream& input = (input_filename_ == "") ? cin : ifstream(input_filename_, ifstream::in);

我收到此错误但不知道原因。

  

E0330“std :: basic_istream&lt; _Elem,_Traits&gt; :: basic_istream(std :: basic_istream&lt; _Elem,_Traits&gt; :: _ Myt&amp;&amp; _Right)[with _Elem = char,_Traits = std :: char_traits]” (在“d:\ Program Files \ Visual Studio 2017 \ VC \ Tools \ MSVC \ 14.11.25503 \ include \ istream”第55行声明)无法访问

2 个答案:

答案 0 :(得分:1)

您无法将临时绑定到非const 引用。你必须创建一个真正的变量并绑定:

ifstream ifs(input_filename, ifstream::in); // a real variable
istream& input = input_filename.empty() ? cin : ifs; // that should bind properly

通常我会做一些与此类似的事情,以确保用户提供了文件名并正确打开了文件:

std::ifstream ifs;

if(!file_name.empty()) // do we have a file name?
    ifs.open(file_name); // try to open it

if(!ifs) // if we tried to open it but it failed
    throw std::runtime_error(std::string(std::strerror(errno)) + ": " + file_name);

// only attach file to reference if user gave a file name
std::istream& in = file_name.empty() ? std::cin : ifs;

答案 1 :(得分:1)

使用时

istream& input = (input_filename_ == "") ? cin : ifstream(input_filename_, ifstream::in);

表达式的最后一部分是临时的。您不能使用它来初始化非const引用。

你必须稍微不同地处理它。

std::ifstream str;
std::istream* str_ptr = &std::cin;
if (input_filename_ != "")
{
   str.open(input_filename_);
   str_ptr = &str;
}

std::istream& input = *str_ptr;