我將一個項目從MSVC
移植到Borland C++
,我遇到了困難template functions
。例如,下面的模板功能實例化的可移植性問題
void fn(const char *buffer)
{
vector<string> output;
boost::split(output, string(buffer), is_any_of(","));
// ...
導致編譯器錯誤:
[BCC32 Error] example.cpp(208): E2285 Could not find a match for 'split<SequenceSequenceT,RangeT,PredicateT>(vector<string,allocator<string> >,string,is_any_ofF<char>)'
而變形例
void fn(const char *buffer)
{
vector<string> output;
string sBuffer(buffer);
boost::split(output, sBuffer, is_any_of(","));
// ...
編譯罰款。
如帖子標題所示,此問題的泛化是,在某些情況下,如果將參數作爲在函數的參數列表內構建的臨時對象傳入,BCC
似乎不匹配模板函數。
在更改所有受影響的代碼之前,我想了解爲什麼BCC
認爲第一個示例是錯誤的。這是編譯器的缺陷,還是我的代碼不符合C++
標準?我正在使用RAD Studio/C++ Builder XE2
。
「我正在將一個項目從MSVC移植到Borland C++」哦,我可憐你必須承受的地獄。 –
「我正在將一個項目從MSVC移植到Borland C++」我此刻停止閱讀。 –
'boost :: split'是否通過引用,'const'引用或值來引用參數?如果第一個錯誤是正確的,因爲你不能將一個非''const'引用綁定到一個臨時對象。 –