[英]Ambiguous operator>> using Boost 1.59 lexical_cast on Mac OSX
在使用帶有重載輸入/輸出運算符的自定義類使用boost :: lexical強制轉換時,在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>>
用作模板,並將流的字符類型用作模板參數來解決此問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.