Доступ к шаблону указателя на функцию базовых классов - PullRequest
1 голос
/ 14 мая 2009

У меня есть класс, который мне предоставили, который я действительно не хочу менять, но я хочу расширить. Я новичок по шаблону и шаблону, экспериментирующий с шаблоном 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 более глобально, но не смог получить правильный синтаксис из-за неопределенности параметра шаблона.

Ответы [ 3 ]

1 голос
/ 14 мая 2009

Определение определения типа MYFUN в B сделано с приватной видимостью. D не сможет получить к нему доступ. Если вы измените его на защищенный или общедоступный, будет ли он работать?

template <typename T> class B {
  protected:
    typedef std::auto_ptr<T> MYFUN( 
      std::istream&, const std::string&, const std::string& );
...
};
0 голосов
/ 14 мая 2009

Ошибка компиляции связана с тем, что компилятор не может сказать, что вы говорите о типе.

Попытка:

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 Lite для более подробной информации о том, почему это необходимо, но вкратце, из-за возможности специализации шаблона, компилятор не может быть убедитесь, что B<T>::MYFUN действительно ссылается на тип.

0 голосов
/ 14 мая 2009

Проблема, с которой я сталкиваюсь, заключается в том, что B :: MYFUN является private 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;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...