以下无害的函数无法在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
,但这没有帮助。