Я портирую проект из 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
,
Это не потому, что функция является шаблоном; это потому, что по какой-то причине Input
аргумент как неconst
именующий ссылка, как задокументировано Вот:
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)
К такой ссылке. В творческой реинтерпретации языка Microsoft вы можете.
Решение состоит в том, чтобы сделать именно то, что вы сделали: ввести именованную невременную переменную, которую можно передать по ссылке.
Из руководства по Boost
template<typename SequenceSequenceT, typename RangeT, typename PredicateT>
SequenceSequenceT &
split(SequenceSequenceT & Result, RangeT & Input, PredicateT Pred,
token_compress_mode_type eCompress = token_compress_off);
Кажется, что функция действительно берет свои параметры по ссылке, поэтому ваш «обходной путь» — это правильный способ ее использования.
Известно, что MSVC разрешает привязку к неконстантной ссылке как «расширение».