2010-04-23 45 views
0

結束了我寫了下面的程序Binder和可變參數模板在分割故障

#include <iostream> 
template<typename C, typename Res, typename... Args> 
class bind_class_t { 
private: 
    Res (C::*f)(Args...); 
    C *c; 
public: 
    bind_class_t(Res (C::*f)(Args...), C* c) : f(f), c(c) { } 
    Res operator() (Args... args) { 
    return (c->*f)(args...); 
    } 
}; 

template<typename C, typename Res, typename... Args> 
bind_class_t<C, Res, Args...> 
bind_class(Res (C::*f)(Args...), C* c) { 
    return bind_class<C, Res, Args...>(f, c); 
} 

class test { 
public: 
    int add(int x, int y) { 
    return x + y; 
    } 
}; 

int main() { 
    test t; 
    // bind_class_t<test, int, int, int> b(&test::add, &t); 
    bind_class_t<test, int, int, int> b = bind_class(&test::add, &t); 
    std::cout << b(1, 2) << std::endl; 
    return 0; 
} 

用gcc 4.3.3編譯,並得到分割故障。花了一些時間與gdb和這個程序後,我覺得函數和類的地址混淆了,並且不允許調用該類的數據地址。此外,如果我使用註釋行,而不是一切正常。

其他人能否重現此行爲和/或向我解釋發生了什麼問題?

+1

在C++ 0x中,允許執行'return {f,c};'所以你不需要重複長的返回類型。 – 2010-04-23 15:45:43

回答

5

你需要的也許

return bind_class_t<C, Res, Args...>(f, c); 

代替

return bind_class<C, Res, Args...>(f, c); 

否則,你會得到無限遞歸。

+0

哇,這真是一個非常愚蠢的錯誤!謝謝。 – phlipsy 2010-04-23 20:46:41