私は本当に変更したくないクラスを用意していますが、拡張したいと思います。私はパターンとテンプレート初心者で、デコレータパターンをテンプレートクラスに適用して実験しています。 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をよりグローバルに実行しようとしましたが、テンプレートパラメータが定義されていないために構文を正しく取得できませんでした。
それです!どうもありがとう!! – user106740