У меня есть класс, который мне предоставили, который я действительно не хочу менять, но я хочу расширить. Я новичок по шаблону и шаблону, экспериментирующий с шаблоном Decorator, примененным к шаблонному классу. Шаблонный класс содержит указатель на член (если я правильно понимаю семантику) в еще одном классе. Указатель на член является десериализатором потока XML. Тип «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;
};
typedef выглядит странно для меня после прочтения http://www.parashift.com/c++-faq-lite/pointers-to-members.html#faq-33.5,, и, тем не менее, этот класс работает нормально как есть. В предоставленном заголовочном файле нет никаких дополнительных #defines, так что это немного загадочно для меня.
Теперь я пытаюсь расширить его как Декоратор, потому что я хочу сделать немного больше работы с объектом 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)
{ }
Когда я пытаюсь это скомпилировать, я получаю жалобу на синтаксис в двух приведенных строках. Ошибка - это что-то вроде «ожидается») в *. Нет никаких претензий к неопределенности MYFUN.
Когда я переопределяю указатель на член в D с той же сигнатурой, что и в D, т.е.
//change MYFUN to NEWFUN in D)
typedef std::auto_ptr<T> MYNEWFUN(
std::istream&, const std::string&, const std::string& );
Это работает. Я предпочитаю не делать этого для каждого D / Decorator, который я мог бы сделать из B. Я попытался выполнить typedef более глобально, но не смог получить правильный синтаксис из-за неопределенности параметра шаблона.