访问模板的基类功能,指的类型
-
21-08-2019 - |
题
我有一个类,我已经提供的,我真的不想改变,但我要延伸。我是个图案模板的新手尝试用一种装饰的模式应用于一个模板类。模板类包含针对会员(如果我理解正确的语义)还在另一类。指针对部件的解串的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;
};
不隶属于 StackOverflow