zoukankan      html  css  js  c++  java
  • 类成员函数指针使用时编译报错error2440

    成员函数指针可能是经常使用的,在一个使用过程中发现在一种情况下,windows和linux的编译处理不同。
    一般情况下的使用如下:
    class BaseA
    {
    public:
        virtual ~BaseA() {}
    
        void funcBaseA(int v) { cout << "funcBaseA : " << v << " : " << m_ba << endl;}
    private:
        int m_ba{1};
    };
    
    class DerivedA : public BaseA
    {
    public:
        void funcA(int v) { cout << "funcA : " << v << " : " << m_da << endl; }
    private:
        int m_da{3};
    };
    
    测试:
    
        typedef void (BaseA::*pFuncA)(int);
    
        BaseA* ta = new DerivedA;
    
        pFuncA pfa1 = reinterpret_cast<pFuncA>(&BaseA::funcBaseA);
        pFuncA pfa2 = reinterpret_cast<pFuncA>(&DerivedA::funcA);
        (ta->*pfa1)(1);
        (ta->*pfa2)(2);
    
    这个是正常的,在两个平台下表现一致。
    增加以下代码:
    class BaseB
    {
    public:
        virtual ~BaseB() {}
    
        void funcBaseB(int v) { cout << "funcBaseB : " << v << " : " << m_bb << endl;}
    private:
        int m_bb{2};
    };
    
    class DerivedB : public BaseA, public BaseB
    {
    public:
        void funcB(int v) { cout << "funcB : " << v << " : " << m_db << endl; }
    private:
        int m_db{4};
        int m_da{5};
    };
    
    测试: pFuncA pfa3 = reinterpret_cast<pFuncA>(&DerivedB::funcB); BaseA* tb = new DerivedB; (tb->*pfa1)(3); (tb->*pfa3)(4); //(tb->*pfa2)(5);
    此时在linux下编译正常,但在windows下编译器报错无法转换,必须使用强制转换才能通过。
  • 相关阅读:
    [二叉查找树] 1115. Counting Nodes in a BST (30)
    [最小生成树] 继续畅通工程
    [最小生成树] 畅通工程
    [最小生成树] 还是畅通工程
    [图算法] 1030. Travel Plan (30)
    [图算法] 1003. Emergency (25)
    [并查集] More is Better
    [并查集] How Many Tables
    [并查集] 畅通工程
    [并查集] 通信系统
  • 原文地址:https://www.cnblogs.com/nuoforever/p/15217164.html
Copyright © 2011-2022 走看看