2

次のコードを検討してください。

template<class basic_ios_type>
class basic_ios_adaptor;

template<template<typename, class> class basic_ios_type, typename char_type, class traits_type>
class basic_ios_adaptor<basic_ios_type<char_type, traits_type>>
    : public basic_ios_type<char_type, traits_type>
{
public:
    typedef basic_ios_type<char_type, traits_type> base_type;

    basic_ios_adaptor(base_type const& other)
        : base_type(other)
    {
    }
};

使用可能なコンストラクターは、基本型へのconst参照を取得するコピーコンストラクターのみです。使用例:

std::ofstream                    x(std::ofstream(""));  // ok
basic_ios_adaptor<std::ofstream> y(std::ofstream(""));  // error

Visual C ++:

'std :: basic_ios <_Elem、_Traits> :: basic_ios':クラスで宣言されたプライベートメンバーにアクセスできません' std :: basic_ios <_Elem、_Traits> '

Intel:

コンストラクター"std:: basic_ofstream <_Elem、_Traits> :: basic_ofstream [with _Elem = char、_Traits = std::char_traits]"のインスタンスが引数リストに一致しません

なぜこれが機能しないのか誰かが私に説明できますか?

4

4 に答える 4

4

ストリームのコピーコンストラクター(より具体的には、からのコピーctor basic_ios)がプライベートであるため、ストリームをコピーすることはできません。

この質問も参照してください。

于 2011-06-18T16:09:56.560 に答える
4

STLストリームをコピー構築することはできません。それが問題です。

于 2011-06-18T16:10:49.897 に答える
1

すでに述べたように、標準ストリームはコピーできません。ただし、C ++ 0xでは、移動可能です。使用しているコンパイラ/設定によっては、それが表示されている動作である可能性があります。 ofstream x(std::ofstream("x"));一時的なを作成し、ofstreamその一時的なものを名前付きのに移動しofstreamます。これは完全に合法です。ただし、コードではコピーコンストラクターを定義しているため、移動はできません。コピーはまだ禁止されているので、コンパイラはあなたを止めます。

したがって、クラスでは、コピーではなく移動する必要があります。 ios_base_adaptor(base_type&& other) : ofstream(std::move(other)) { }

于 2011-06-18T17:33:26.657 に答える
0

さて、私が達成したいのは、私が派生したbasic_ios<>クラスを作成する可能性です。したがって、私の例では、指定されたファイルのofstreamを作成したかっただけです。

次の方法で可能です。

template<template<typename, class> class basic_ios_type, typename char_type, class traits_type>
class basic_ios_adaptor<basic_ios_type<char_type, traits_type>>
    : public basic_ios_type<char_type, traits_type>
{
public:
    typedef basic_ios_type<char_type, traits_type> base_type;

    template<class create>
    basic_ios_adaptor(create& create)
    {
        create(static_cast<base_type*>(this));
    }
};

この段階ではすでに割り当てられて構築されているため、基本クラスへのポインタを渡すのは安全です。

使用法:

struct construct
{
    void operator()(std::ofstream* o) { 
        *o = std::ofstream("file");
    }
};

construct c;
basic_ios_adaptor<std::ofstream> y(c);

他の回避策はありますか?

于 2011-06-18T17:24:29.800 に答える