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