使用模板函数指针声明模板函数

时间:2011-11-16 16:43:31

标签: c++ templates visual-c++ function-pointers

我第一次同时使用模板和指向成员函数的指针,我偶然发现了以下问题。

我为typedef声明了一个struct Proxy,因为templates和typedef不能一起工作(我知道这应该可以在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 个答案:

答案 0 :(得分:5)

您需要使用typename来指明从属名称的类型;特别是,Method的第一个声明应该是:

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

并且你说的那行没有问题编译(但只是因为VC ++有一个接受格式错误的代码的“扩展名”)应该是:

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

在类定义之后,您还缺少分号,在CClass的定义之前还有Proxy的前向声明。

答案 1 :(得分:2)

// 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,不知道它为什么要编译。