我需要在Visual Studio 2013上编译代码
原来我有:
class P
{
typedef void* (P::*FunctionPtr)(void);
typedef void* (*T_ptr)(void*);
private:
T_ptr getCompatibleFunctionPointer(FunctionPtr funcPtr);
T_ptr m_t_ptr;
public:
[omitting constructors, etc]
}
现在,添加模板需要使用关键字,所以我尝试了:
typedef void* (*T_ptr)(void*);
//tried this:
template<typename objectThread>
using FunctionPtr = void(P<objectThread>::*)(void);
//also tried:
template<typename objectThread>
using FunctionPtr = void(P< typename objectThread>::*)(void);
//also tried:
template<typename objectThread>
using FunctionPtr = void(P< typename objectThread>*)(void);
template<typename objectThread>
class P{
private:
template<typename objectThread>
T_ptr P<objectThread>::getCompatibleFunctionPointer(FunctionPtr funcPtr) {}
T_ptr m_t_ptr;
};
我无法找到实现我需要的方法。我确实需要保留模板,不能使用Boost(以防万一)。
答案 0 :(得分:1)
你可以在课堂上用
声明它using FunctionPtr = void(P<objectThread>::*)();
并且只是在课堂上使用它。
所以,你的代码只是
template<typename objectThread>
class P{
using T_ptr = void*(*)(void*);
using FunctionPtr = void(P<objectThread>::*)();
private:
T_ptr getCompatibleFunctionPointer(FunctionPtr funcPtr) {}
T_ptr m_t_ptr;
};
答案 1 :(得分:0)
我没有看到问题。唯一看起来很奇怪的是你在别名中使用P
作为类模板。在代码段中,P
不是模板。
无论如何,这是我用于成员函数指针的内容:
template <typename Class, typename Ret, typename ... Args>
using MemFunPtr = Ret (Class::*)(Args ...);
你可以像这样使用它:
struct A
{
void fun(int, char) { cout << "whoop\n"; }
};
int main()
{
MemFunPtr<A, void, int, char> m = &A::fun;
A a;
(a.*m)(5, 'a');
}