我遇到模板化成员函数指针的问题。 代码如下所示。
#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;
作为成员变量我得到与上面相同的错误。
答案 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;