2009-05-14 17 views
1

私は本当に変更したくないクラスを用意していますが、拡張したいと思います。私はパターンとテンプレート初心者で、デコレータパターンをテンプレートクラスに適用して実験しています。 Templateクラスには、別のクラスのメンバへのポインタ(私が正しくセマンティクスを理解している場合)が含まれています。メンバーへのポインタは、XML istreamのデシリアライザです。タイプ 'T'は、逆シリアル化されるXML文書のタイプです。テンプレート基底クラスへのアクセス関数のポインタ型

template <typename T> class B { 
public: 
    typedef std::auto_ptr<T> MYFUN( 
    std::istream&, const std::string&, const std::string&); 

public: 
    B<T>(MYFUN* p); 

private: 
    MYFUN *fptr; 
    std::string aString1; 
    std::string aString2; 

};

http://www.parashift.com/c++-faq-lite/pointers-to-members.html#faq-33.5を読んだ後にtypedefが奇妙に見えますが、このクラスは現状どおりに機能するようです。提供されたヘッダファイルには#defineは何も追加されていないので、少し不思議です。

今、私はMYFUNによって返さauto_ptrを対象にもう少し仕事をしたいので、私はデコレータとして、それを拡張しよう:

template <typename T> 
class D : public class B<T> 
{ 
    D(B<T>::MYFUN *fPtr, B<T> *providedBase); //compiler complaint 
    //Looks like B 
    private: 
    B* base_; 

}; 

template <typename T> 
D<T>::D(B<T>::MYFUN *p, B<T> *base) //compiler complaint 
: 
B<T>::B(p), base_(providedBase) 
{ } 

これをコンパイルしようと、私が構文苦情を取得すると2行が表示されます。エラーは "〜で" "期待"のようなものです)。 MYFUNが未定義であることについての苦情はありません。

I再定義へのポインタ部材Dと同じシグネチャを持つDで、即ち

//change MYFUN to NEWFUN in D) 
typedef std::auto_ptr<T> MYNEWFUN( 
    std::istream&, const std::string&, const std::string&); 

この作品。私はBを作るかもしれないすべてのD/Decoratorに対してこれを行う必要はない方がいいです。typedefをよりグローバルに実行しようとしましたが、テンプレートパラメータが定義されていないために構文を正しく取得できませんでした。

答えて

0

コンパイルエラーは、コンパイラがあなたがタイプについて話している言うことができないという事実によるものです。

試してみてください。これが必要な理由の詳細についてはthe templates section of the C++ FAQ Liteが、概要が原因テンプレートの特殊化の可能性、方法がないということである。

D(typename B<T>::MYFUN *fPtr, B<T> *providedBase); 

template <typename T> 
D<T>::D(typename B<T>::MYFUN *p, B<T> *base) 

を参照してください。コンパイラがB<T>::MYFUNが実際に型を参照していることを確かめてください。

+0

それです!どうもありがとう!! – user106740

1

BのMYFUN typedefの定義は、私的な可視性で行われます。 Dはそれにアクセスできなくなります。あなたが保護されているか公的に変更されている場合は、それは機能しますか?

template <typename T> class B { 
    protected: 
    typedef std::auto_ptr<T> MYFUN( 
     std::istream&, const std::string&, const std::string&); 
... 
}; 
+0

私は間違って「public」宣言を中止しました – user106740

0

私はこれを見る問題はB :: MYFUNがプライベートのtypedefであるということです。

したがって、継承するクラスはそれにアクセスできません。

変更これに:

template <typename T> class B 
{ 
public: 
    typedef std::auto_ptr<T> MYFUN( std::istream&, const std::string&, const std::string&); 
public: 
    B<T>(MYFUN* p); 
private: 
    MYFUN *fptr; 
std::string aString1; 
std::string aString2; 
}; 
+0

私は間違って「public」宣言を残しました – user106740

関連する問題