【发布时间】:2013-09-03 22:09:09
【问题描述】:
我遇到了一些奇怪的行为。
这段代码给了我错误:
struct Game {
void stop() {std::cout << "success\n";}
};
template<class ...Args>
struct holder {
std::map<std::string, std::function<void(Args...)>> funcMap;
template <typename T, typename U>
void connect(T* targObj, const std::string& funcName) {
std::function<void(Args...)> newFunc = std::bind(U, targObj);
//expected primary expression before ',' token on line above
funcMap[funcName] = newFunc;
}
void invoke(const std::string& funcName, class Args...Vals)
{funcMap[funcName](Vals...);}
};
int main() {
holder<> h;
Game g;
h.connect<Game, &Game::stop>(g, "close");
h.invoke();
}
似乎std::bind 不喜欢类型名作为输入。有解决方法吗?手动使用具有相同参数的std::bind 可以正常工作,但它是更多样板代码:
std::function<void(Args...)> newFunc = std::bind(&ae::Game::stop, targObj);
即使没有任何输入,它仍然在编译时出错。为什么我的功能不起作用?
编辑:感谢您的帮助。事实证明,bind 不接受类型名,它接受地址。
【问题讨论】:
-
显示编译错误,使用
auto代替std::function<void(Args...)> -
错误出现在有问题的代码行旁边的注释中。我使用的是自动,但我刚刚尝试过。
-
ae::Game::stop是类型还是变量还是函数? -
@Astrognome:提示:函数的实例不是类型。
-
我会用什么来代替 typename?错误来自绑定不接受模板类型名作为参数。