2015-09-04 102 views
0

当使用带有重载输入/输出操作符的自定义类的boost :: lexical强制类型转换时,我在Max OSX上编译时遇到了模糊的重载运算符>>。在这种情况下,使用Macports安装Boost 1.59。模糊运算符>>在Mac OSX上使用Boost 1.59 lexical_cast

下面是示出两者的误差和期望结果的自包含例如:

#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 

改为使用升压:: 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) ... 

代码工作既没有 “-D__DEMO__” Linux,Boost诉1.51。任何想法/提示将不胜感激!

回答

1

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