C ++中的模板化函数指针

时间:2014-02-18 19:13:31

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

我遇到模板化成员函数指针的问题。 代码如下所示。

#include <String>
#include <iostream>
template<typename T>
struct method_ptr
{
    typedef void (T::*Function)(std::string&);
};

template <class T>
class EventHandler
{
private:
    method_ptr<T>::Function m_PtrToCapturer;
};

e:\ EventHandler.h(13):错误C2146:语法错误:缺少';'在标识符'm_PtrToCapturer'之前

我正面临这个错误。

即使我使用

method_ptr<EventHandler>::Function m_PtrToCapturer;

作为成员变量我得到与上面相同的错误。

3 个答案:

答案 0 :(得分:3)

由于method_ptr<T>::Function依赖名称(取决于T),因此您需要使用typename消除歧义:

template <class T>
class EventHandler
{
private:
    typename method_ptr<T>::Function m_PtrToCapturer;
//  ^^^^^^^^
};

答案 1 :(得分:0)

这有效,

struct method_ptr
{
    typedef void (T::*Function)(std::string&);
};

template <class T>
class EventHandler
{

private:
    typename method_ptr<T>::Function m_PtrToCapturer;
};

答案 2 :(得分:-1)

从C ++ 11开始,您可以使用using

template <typename T>
using Function = void (T::*)(std::string);

(顺便说一句,为什么std::string按值调用?我推荐const std::string &。)


啊哈,我想出了你的第二个问题。

template <typename T>
method_ptr<T>::Function m_PtrToMemFunc; //<--

模板仅适用于类和函数(以及cpp11的typedef&amp; using ...)。你应该这样写。

method_ptr<SomeClass>::Function m_PtrToMemFunc;