Не удалось найти соответствие для 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() );

но, к сожалению, это не так.

Итак, у меня есть два вопроса

  1. Почему моя конструкция не проходит через std::istreambuf_iterator<char> не совпадает?
  2. Что это за макрос _RWSTD_NO_MEMBER_TEMPLATES за?

Заметка

  1. Основываясь на комментарии, я попытался сгенерировать вывод препроцессора, запустив CC -E test.cpp > pre.out и найдено, версия итератора не была сгенерирована. Поэтому я попытался определить _RWSTD_NO_MEMBER_TEMPLATES но это не помогло

0 ответов

Другие вопросы по тегам