1

pimplイディオムを使用して、汚れたテンプレートコードを非表示にしようとしていますが、bodyクラスのフレンドの派生クラスにハンドルクラスへのアクセスを許可できません。MSVC9sp1からエラーC2248が発生します。エラーを複製するためのコードは次のとおりです。

//
// interface.hpp
//
namespace internal{
    template<class T>
    class specific_body;
}

class interface
{
    struct body;
    body *pbody_;
    interface(body *pbody);

    template<class T>
    friend class internal::specific_body;

public:

    ~interface();

    interface(const interface &rhs);

    bool test() const;

    static interface create( bool value );
};

//
// interface.cpp
//
struct interface::body
{
    virtual ~body(){}

    virtual bool test() const = 0;

    virtual interface::body *clone() const = 0;
};

class true_struct {};
class false_struct {};

namespace internal {

template< class T>
class specific_body : public interface::body
{ // C2248
public:

    specific_body(){}

    virtual bool test() const;

    virtual interface::body *clone() const
    {
        return new specific_body();
    }
};

bool specific_body<true_struct>::test() const
{
    return true;
}

bool specific_body<false_struct>::test() const
{
    return false;
}

} //namespace internal

interface::interface(body *pbody) : pbody_(pbody) {}

interface::interface(const interface &rhs) : pbody_(rhs.pbody_->clone()) {}

interface::~interface() { delete pbody_; }

bool interface::test() const
{
    return pbody_->test();
}

interface interface::create(bool value )
{
    if ( value )
    {
        return interface(new internal::specific_body<true_struct>());
    }
    else
    {
        return interface(new internal::specific_body<false_struct>());
    }
}

//
// main.cpp
//
// #include "interface.hpp"
//

int _tmain(int argc, _TCHAR* argv[])
{
    interface object( interface::create(true));

    if ( object.test() )
    {
        // blah
    }
    else
    {
    }
    return 0;
}

助けていただければ幸いです。私の質問から明らかでない場合は、ユーザーから実装を隠そうとしてinterface::bodyいます。specific_bodyinterface

4

5 に答える 5

1

テンプレートテストメソッドの明示的なインスタンス化にtemplate<>を追加する必要があります

template<> // add this line
bool specific_body<true_struct>::test() const
{
    return true;
}
于 2009-10-17T09:26:09.730 に答える
0

資格がありませんspecific_body。試す

template<class T>
friend class internal::specific_body;

あなたの友達の宣言として。

于 2009-10-16T18:14:50.580 に答える
0

たぶんtypenameを使ってみませんか?私はSutterで、typenameは未知のスコープ内のクラスに到達するために機能するが、クラスは機能しないことを読んだと思います。

于 2009-10-16T18:29:42.900 に答える
0

Troubadourによって言及された修飾されていないspecific_bodyに加えて、true_structおよびfalse_structに対するspecific_body <>::testの特殊化の試みは正しくないようです。あなたはフルクラスを専門にする必要があります。

この問題を解決するために、私は単に公開セクションで本文を宣言します。さらに、specific_bodyをinterface::bodyのフレンドであると宣言しても役に立ちません。

于 2009-10-16T18:35:44.483 に答える
0

bodyさて、私はインターフェースで公開宣言を行うことでこの問題を「解決」することができました。これにより、の宣言中のC2248エラーが解決されますspecific_body。また、クラスbodyの友達を作り、構造体にメソッドを追加しました。interfacebody

static interface create( body *pbody )
{
    return interface(pbody);
}

のインスタンス間にネストされた関係がある場合にspecific_bodyを作成できるようにinterfacespecific_body

于 2009-10-19T11:35:25.383 に答える