次の無害な関数は、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() );
しかし、残念ながらそうではありませんでした。
だから私は2つの質問があります
std::istreambuf_iterator<char>
私のコンストラクション ビアが一致しないのはなぜですか?- このマクロ
_RWSTD_NO_MEMBER_TEMPLATES
の目的は何ですか?
ノート
- コメントをもとに実行してプリプロセッサ出力を生成しようとした
CC -E test.cpp > pre.out
ところ、イテレータ版が生成されていませんでした。だから私は定義を解除しようとしまし_RWSTD_NO_MEMBER_TEMPLATES
たが、それは役に立ちませんでした。