抛出模板专业化错误的函数指针数组(包括成员函数)
Posted
技术标签:
【中文标题】抛出模板专业化错误的函数指针数组(包括成员函数)【英文标题】:Array of function pointers ( including member functions) throwing template specialization error 【发布时间】:2016-06-14 16:32:40 【问题描述】:所以,我有一个名为 Delegate 的类,它可以存储函数指针数组。这是代码:
template<typename Func>
class delegate
private:
public:
typename std::vector<Func> mListOfFunctions;
void Bind(Func f)
mListOfFunctions.push_back(f);
template<typename...TArgs>
void Invoke(TArgs&&...arg)
for (auto f : mListOfFunctions)
f(std::forward<TArgs>(arg)...);
;
在 Player.cpp 中的用法:
delegate<void(float)> testDelegate;
testDelegate.Bind(std::bind(&Player::MoveLeft,this));
这会引发错误 C2893(错误 C2893 无法专门化函数模板 'unknown-type std::invoke(_Callable &&,_Types &&...)')
但是当我将 Bind 的定义更改为以下内容时:
template<typename F>
void Bind(F f)
它工作正常,但是当我尝试将函数对象推入向量时,它再次抛出相同的错误。
有没有办法解决这个问题?
我需要缓存传入的指针。
【问题讨论】:
【参考方案1】:std::bind
的结果不是一个函数指针(它是一个未指定类型的函数对象),但您正试图将其合二为一。既然你用的是std::forward
,那你肯定用的是C++11,也就是说你可以用std::function
:
template<typename Func>
class delegate
private:
public:
typename std::vector<std::function<Func>> mListOfFunctions;
void Bind(std::function<Func> f)
mListOfFunctions.push_back(f);
template<typename...TArgs>
void Invoke(TArgs&&...arg)
for (auto f : mListOfFunctions)
f(std::forward<TArgs>(arg)...);
;
【讨论】:
我将其更改为以下内容,但仍然抛出错误: void Bind(std::functionBind
2. 确切的新错误消息。
在您的情况下,您没有使用成员函数。但是,当我尝试使用 std::bind 添加成员函数并将其作为 std::function 传递时,它会引发与问题中相同的错误(C2893)以上是关于抛出模板专业化错误的函数指针数组(包括成员函数)的主要内容,如果未能解决你的问题,请参考以下文章
成员函数指针数组:当控件到达指向成员函数的指针时获取 0xcccccccc