C++ C++;std::bind接受typename作为第一个参数

C++ C++;std::bind接受typename作为第一个参数,c++,typename,stdbind,C++,Typename,Stdbind,我遇到了一些奇怪的行为 这段代码给了我错误: 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, typena

我遇到了一些奇怪的行为

这段代码给了我错误:

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();
}
即使没有任何输入,它仍然会在编译时出错。为什么我的函数不起作用


编辑:谢谢你的帮助。事实证明,bind不接受类型名,它接受地址。

我猜函数是静态的? 如果没有解决方案,则需要调用一个对象


但是bind试图在没有对象的情况下使用参数
调用
g
“close”
,如果不是静态的,任何人都无法完成此任务:

只需使用宏。如果没有自定义绑定实现,这几乎是不可能的

#define BINDMF(a,b,c) (std::bind(&a::b, c))

这很简单,真的:

template <typename T, typename U>
void connect(T* targObj, const std::string& funcName) {
T=Game
,并且
Game
是一种类型,所以这很好
U=&Game::stop
,它是
void(Game::*)()
的变量/实例,因此这就是失败的原因。我不知道为什么你的编译器会给出愚蠢的错误。解决方案是将函数变量作为参数传递:

template <typename T>
void connect(T* targObj, void(Game::func*)(Args...), const std::string& funcName) 

如图所示:

显示编译器错误,并使用
auto
而不是
std::function
错误位于错误代码行旁边的注释中。我用的是auto,但我刚刚试过。是类型、变量还是函数?@Astrognome:Tip:函数的实例不是类型。那么我用什么来代替typename呢?该错误源于bind不接受模板typename作为参数。我只需要bind接受typename。如果我直接输入这样的类型:std::function newFunc=std::bind(&ae::Game::stop,targObj);是的,因为这个
&ae::Game::stop
是一个地址,所以这个
typename&ae::Game::stop
没有任何意义。。只需将位更改为有意义的代码,就很容易做到这一点。
h.connect<Game, &Game::stop>(g, "close");
template <typename T>
void connect(T* targObj, void(Game::func*)(Args...), const std::string& funcName) 
h.connect(g, &Game::stop, "close");