Не удалось найти соответствие для std:: string:: basic_string (std:: istreambuf_iterator<char, std:: char_traits <char >>, std:: istreambuf_iterator <char, std::
Следующая безвредная функция не компилируется в Solaris Studio 12.3
#undef _RWSTD_NO_MEMBER_TEMPLATES
#include <fstream>
#include <string>
#define _RWSTD_NO_MEMBER_TEMPLATES
std::string FetchData(const std::string& fname)
{
std::ifstream fin(fname.c_str());
std::string data;
if (fin)
{
data = std::string((std::istreambuf_iterator<char>(fin)),
std::istreambuf_iterator<char>());
}
return data;
}
int main()
{
return 0;
}
который завершается с сообщением об ошибке
Не удалось найти соответствие для
std::string::basic_string(std::istreambuf_iterator<char, std::char_traits<char>>, std::istreambuf_iterator<char, std::char_traits<char>>)
необходимо вOOTest::FetchData(const std::string &)
,
Сейчас я проверил файл std::string
и нашел следующее
#ifndef _RWSTD_NO_MEMBER_TEMPLATES
template <class _InputIterator>
basic_string (_InputIterator, _InputIterator, const _Allocator& _RWSTD_DEFAULT_ARG(_Allocator()));
Так что я думаю, std::string
имеет декларацию для перегрузки
template< class InputIt >
basic_string( InputIt first, InputIt last,
const Allocator& alloc = Allocator() );
который должен был соответствовать
template< class InputIt >
basic_string( InputIt first, InputIt last,
const Allocator& alloc = Allocator() );
но, к сожалению, это не так.
Итак, у меня есть два вопроса
- Почему моя конструкция не проходит через
std::istreambuf_iterator<char>
не совпадает? - Что это за макрос
_RWSTD_NO_MEMBER_TEMPLATES
за?
Заметка
- Основываясь на комментарии, я попытался сгенерировать вывод препроцессора, запустив
CC -E test.cpp > pre.out
и найдено, версия итератора не была сгенерирована. Поэтому я попытался определить_RWSTD_NO_MEMBER_TEMPLATES
но это не помогло