gpt4 book ai didi

c++ - 模板函数实例化的可移植性问题

转载 作者:太空狗 更新时间:2023-10-29 20:28:43 25 4
gpt4 key购买 nike

我正在将一个项目从 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 lvalue 引用,如记录 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++ 中,您不能将临时 rvalue(例如 string(buffer))绑定(bind)到此类引用。在 Microsoft 对语言的富有想象力的重新解释中,您可以。

解决方案就是完全按照您所做的去做:引入一个可以通过引用传递的命名的非临时变量。

关于c++ - 模板函数实例化的可移植性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12582599/

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