Tech Off Post

Single Post Permalink

View Thread: C++0x (vs2010) question, please tell me what i'm doing wrong
  • User profile image
    Mr Crash

    Hello fellow C++0x programmers.

     

    I have this code:

    void normal_func(int p)
    {
        _tprintf_s(_T("p: %d\n"), p);
    }
    
    struct normal_struct_func
    {
        inline void operator()(int p) const
        {
            _tprintf_s(_T("p: %d\n"), p);
        }
    };
    
    template<typename T, typename Function>
    void test_f(T p, Function func)
    {
        func(p);
    }
    
    template<typename T, typename Function>
    class test_c {
    public:
        explicit test_c(T p, Function func) : m_p(p), m_Func(func) {}
    
        ~test_c(void)
        {
            m_Func(m_p);
        }
    
        T get(void) const
        {
            return m_p;
        }
    
    private:
        T m_p;
        const Function m_Func;
    };
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        // test_f tests
        test_f(11, [](int p){_tprintf_s(_T("p: %d\n"), p);});
        test_f(22, normal_func);
        test_f(33, normal_struct_func());
        
        // test_c tests
        // error C2976: 'test_c' : too few template arguments
        //test_c<int> tc1(11, [](int p){_tprintf_s(_T("p: %d\n"), p);});
        //test_c<int> tc2(22, normal_func);
        //test_c<int> tc3(33, normal_struct_func());
    
        // error C2664: 'test_c<T,Function>::test_c(T,Function (__cdecl *))' : cannot convert parameter 2 from '`anonymous-namespace'::<lambda1>' to 'void (__cdecl *)(int)'
        // ...
        test_c<int, void(int)> tc1(11, [](int p){_tprintf_s(_T("p: %d\n"), p);});
        test_c<int, void(int)> tc2(22, normal_func);
        test_c<int, void(int)> tc3(33, normal_struct_func());
    
        return 0;
    }
    

     

    The 'test_f' works as it should but test_c class, which does the same basically, does not.

     

    Problem list:

    1. How to make this compile. What am i missing / doing wrong.

    2. Why do i have to type "test_c<int, void(int)>" instead of just "test_c<int>", the compiler should be able to figure that out, it did that for "test_f"

     

    Thanks for your help.