Объявление функции шаблона с указателем на функцию шаблона - PullRequest
1 голос
/ 16 ноября 2011

Впервые я использую шаблоны и указатель на функции-члены одновременно, и я наткнулся на следующую проблему.

Я объявил struct Proxy для typedef, поскольку шаблоны и typedefs не работают вместе (я знаю, что это должно быть возможно в C ++ 11, хотя MSVC ++ не принимает его).Теперь я хочу объявить шаблонную (!) Функцию, которая использует прокси с типом шаблонов.Это то, что вызывает ошибку при компиляции.Пожалуйста, посмотрите на (упрощенный) код ниже, я добавил несколько примеров, чтобы прояснить проблему.

Я работаю со стандартом VC ++ 2010 (без CLR / CLI).

template<typename T>
struct Proxy
{
    typedef bool (CClass::*MethodPtr)(const T* const objectX);
}

class CClass
{
    // warning: dependent name is not a type
    // error:: Method can not be a template definition
    template<typename T>
    bool Method( Proxy<T>::MethodPtr );

    // this works, but i want to specify T instead of int of course
    template<typename t>
    bool method( Proxy<int>::MethodPtr );

    // this is what i use
    template<typename T>
    bool Method( bool (CClass::*MethodPtr)(const T* const objectX) );
}

template<typename T>
bool CClass::Method( bool (CClass::*MethodPtr)(const T* const objectX) ) 
{
    // next line compiles without problems
    Proxy<T>::MethodPtr ptr2;
}

Ответы [ 2 ]

5 голосов
/ 16 ноября 2011

Вам нужно использовать typename, чтобы указать, где зависимое имя является типом; в частности, первое объявление Method должно быть:

template<typename T>
bool Method( typename Proxy<T>::MethodPtr );

и строка, которую вы говорите, компилируется без проблем (но только потому, что VC ++ имеет «расширение», которое принимает некорректный код) должно быть:

// next line compiles without problems
typename Proxy<T>::MethodPtr ptr2;

Вы также пропускаете точки с запятой после определений классов и предварительное объявление CClass перед определением Proxy.

2 голосов
/ 16 ноября 2011
// warning: dependent name is not a type
// error:: Method can not be a template definition
template<typename T>
bool Method( Proxy<T>::MethodPtr );

MethodPtr зависит от аргумента шаблона T, вы должны использовать typename.

// next line compiles without problems
Proxy<T>::MethodPtr ptr2;

Вам также следует использовать typename, не знаю, почему он компилируется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...