gpt4 book ai didi

c++ - 模糊运算符>> 在 Mac OSX 上使用 Boost 1.59 lexical_cast

转载 作者:行者123 更新时间:2023-11-28 06:05:59 25 4
gpt4 key购买 nike

当使用带有重载输入/输出运算符的自定义类的 boost::lexical cast 时,我在 Max OSX 上编译时得到一个不明确的重载运算符>>。在这种情况下,Boost 1.59 是使用 Macports 安装的。

下面是一个说明错误和预期结果的独立示例:

#include <iostream>
#include <string>
#include <sstream>
#ifdef __DEMO__
#include <boost/lexical_cast.hpp>
#endif

using namespace std;

enum BoolYN_ENUM { FALSE_YN, TRUE_YN, UNSET_YN};

class BoolYN{
public:
BoolYN() : _dat(UNSET_YN){}
BoolYN(const BoolYN& o) : _dat(o._dat) {}

BoolYN& operator=(const BoolYN_ENUM& val){ _dat = val; return *this;}
BoolYN& operator=(const BoolYN& o){ _dat = o._dat; return *this;}

operator const char*() const{
switch(_dat){
case FALSE_YN:
return "F";
case TRUE_YN:
return "T";
default:
return "U";
}
}

operator int() const {return _dat;}

private:
BoolYN_ENUM _dat;
};

istream& operator>>(istream& is, BoolYN& obj){
string token;
is >> token;
if(token.size() > 0){
char s = token[0];
if(s == 'Y' || s == 'y'){
obj = TRUE_YN;
} else if (s == 'N' || s == 'n') {
obj = FALSE_YN;
} else {
obj = UNSET_YN;
}
} else {
obj = UNSET_YN;
}
return is;
}

ostream& operator<<(ostream& os, BoolYN& obj){
os << (const char*) obj;
return os;
}

int main(int argc, char** argv){

for(int i=1; i<argc; i++){
string argi(argv[i]);
#ifndef __DEMO__
stringstream ss(argi);
BoolYN boolval;
ss >> boolval;
#else
BoolYN boolval = boost::lexical_cast<BoolYN>(argi);
#endif
cout << "Argument " << i << ": " << boolval << endl;
}
return 0;
}

为了说明所需的行为,只需使用适当的包含路径进行编译。参数在命令行上给出,并使用重载的 << 和 >> 运算符进行适当解析。

$ g++ main.cpp
$ a.out Yes No IDK
Argument 1: T
Argument 2: F
Argument 3: U

要改为使用 boost::lexical_cast,请使用“-D__DEMO__”进行编译,这会给出以下错误:

In file included from main.cpp:6:
In file included from /opt/local/include/boost/lexical_cast.hpp:32:
In file included from /opt/local/include/boost/lexical_cast/try_lexical_convert.hpp:35:
In file included from /opt/local/include/boost/lexical_cast/detail/converter_lexical.hpp:39:
In file included from /opt/local/include/boost/type_traits/has_right_shift.hpp:43:
/opt/local/include/boost/type_traits/detail/has_binary_operator.hpp:158:70: error: use of overloaded operator '>>' is ambiguous (with operand types 'std::__1::basic_istream<wchar_t>' and 'BoolYN')
BOOST_STATIC_CONSTANT(bool, value = (sizeof(s_check(((make<Lhs>() BOOST_TT_TRAIT_OP make<Rhs>()),make<has_operator>())))==sizeof(::boost::type_traits::yes_type)));

... (very long error msg. truncated) ...

在 Linux Boost v. 1.51 上,无论有没有“-D__DEMO__”,代码都能正常工作。任何想法/提示将不胜感激!

最佳答案

我没有你的环境来精确分析。然而,看起来有一个图书馆候选人operator>>它与 lexical_cast 实现传递的第一个参数有更好的匹配,但(自然地)与 BoolYN 的匹配较差争论。特别注意诊断中的操作数类型是 basic_stream<wchar_t> ,而你的 operator>>需要 istream ( basic_istream<char> ,我相信)。所以也许你可以通过制作 operator>> 来解决这个问题具有流字符类型的模板作为模板参数。

关于c++ - 模糊运算符>> 在 Mac OSX 上使用 Boost 1.59 lexical_cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32401849/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com