【发布时间】:2014-01-19 12:23:11
【问题描述】:
我正在尝试使用三元运算符清理一些代码,但遇到了一些我无法理解的编译器错误。
我之前的代码看起来像这样并且运行良好。
if(!inFile.good())
throw -2;
getline(inFile, inLine);
我正在尝试使用此代码来清理它。
(inFile.good()) ? getline(inFile, inLine) : throw -2;
但我收到以下错误。
g++ -w -o test orange_test.cpp
In file included from orange_test.cpp:4:
In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/iostream:39:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/streambuf:558:31: error: base class 'std::__1::ios_base' has private
copy constructor
_LIBCPP_EXTERN_TEMPLATE(class basic_ios<char>)
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/__config:462:54: note: expanded from macro '_LIBCPP_EXTERN_TEMPLATE'
#define _LIBCPP_EXTERN_TEMPLATE(...) extern template __VA_ARGS__;
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/ios:305:5: note: declared private here
ios_base(const ios_base&); // = delete;
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/istream:1706:31: note: implicit default copy constructor for
'std::__1::basic_ios<char>' first required here
_LIBCPP_EXTERN_TEMPLATE(class basic_istream<char>)
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/__config:462:54: note: expanded from macro '_LIBCPP_EXTERN_TEMPLATE'
#define _LIBCPP_EXTERN_TEMPLATE(...) extern template __VA_ARGS__;
^
./orange_model.hpp:145:23: note: implicit default copy constructor for 'std::__1::basic_istream<char>' first required here
(inFile.good()) ? getline(inFile, inLine) : throw -2;
^
1 error generated.
make: *** [main] Error 1
我无法理解它。三元运算符或范围是否存在一些我不知道的限制?任何帮助或见解将不胜感激。 提前致谢, 最大
编辑
从看来,主要错误似乎是
error: base class 'std::__1::ios_base' has private copy constructor
它在抱怨 std::getline(inFile, inLine) 函数。
回答
这段代码让它运行顺利。谢谢大家!
inFile.good() ? (void) getline(inFile, inLine) : throw -2;
【问题讨论】:
-
从
if更改为条件运算符将被许多人(包括我)认为与清理相反。使用条件运算符的代码比使用原始if的代码更加晦涩难懂。并且这条规则适用于条件运算符的几乎所有用途,它们不是选择这些两个值之一
标签: c++ std ternary-operator