我有一个类,我已经提供的,我真的不想改变,但我要延伸。我是个图案模板的新手尝试用一种装饰的模式应用于一个模板类。模板类包含针对会员(如果我理解正确的语义)还在另一类。指针对部件的解串的XML istream.该类型的'T'类型的XML文件deserialized.

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;

};

Typedef看起来奇怪,我在阅读 http://www.parashift.com/c++-faq-lite/pointers-to-members.html#faq-33.5, ,但此类似工作的现。没有任何其他#定义在所提供的头文件,因此,这是一点神秘的我。

现在我尽量延长,作装饰,因为我想要做更多的工作auto_ptr对象返回的MYFUN:

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)
{ }

当试图编纂这个,我得到一个法申诉在该两条线图所示。错误的东西像"预期')'at*".有没有申诉有关MYFUN正在不确定的。

当我重新定义的指针件D有相同的签名作为在D,即

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

这一工作。我不喜欢有这样做的每一个D/装饰我可能会做出的B我试图来执行typedef在更大的范围内,但不能得到法权利由于该模板参数正在不确定的。

有帮助吗?

解决方案

在编译错误是由于编译器不能告诉你是在谈论一个类型。

尝试:

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

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

请参阅:的C ++ FAQ精简版<的模板部分/ A>关于为什么这是必要的,但总结是,由于模板专业化的可能性,也没有办法让编译器确保B<T>::MYFUN实际上是指一个类型的详细资料

其他提示

B中的MYFUN的typedef的定义与私人能见度完成。 d将无法访问它。如果您将其更改为受保护的或公共的,它工作呢?

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

我与此看到的问题是,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;
};
scroll top