Проблема переносимости с функцией шаблона Instantiation

Я портирую проект из 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,

3

Решение

Это не потому, что функция является шаблоном; это потому, что по какой-то причине 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 вы можете.

Решение состоит в том, чтобы сделать именно то, что вы сделали: ввести именованную невременную переменную, которую можно передать по ссылке.

3

Другие решения

Из руководства по 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 разрешает привязку к неконстантной ссылке как «расширение».

3

По вопросам рекламы [email protected]