c – 模板功能实例化的可移植性问题
作者:互联网
我正在将一个项目从MSVC移植到Borland C,我遇到了模板功能的困难.例如,以下内容
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.
解决方法:
这不是因为函数是模板;这是因为出于某种原因,它将其Input参数作为非const左值引用,如文档here所示:
template<typename SequenceSequenceT, typename RangeT, typename PredicateT>
SequenceSequenceT &
split(SequenceSequenceT & Result, RangeT & Input, PredicateT Pred,
token_compress_mode_type eCompress = token_compress_off);
在标准C中,您不能将临时右值(例如字符串(缓冲区))绑定到此类引用.在微软对该语言的富有想象力的重新诠释中,你可以.
解决方案是完成你所做的:引入一个可以通过引用传递的命名的非临时变量.
标签:c,templates,cbuilder,cbuilder-xe2,template-function 来源: https://codeday.me/bug/20190826/1726536.html