用于多态处理一个元素的关联容器

时间:2017-01-27 20:18:28

标签: c++

假设我有以下设置:

#include <iostream>
#include <map>

using namespace std;

class A
{
public:
    A() { val1 = 1;}
    ~A() { }

private:
    int val1;
};

class B
{
public:
    B() { val2 = 1;}
    ~B() { }
    int getVal() {return val2;}

private:
    int val2;
};

class C : public A, public B
{

    int val3;
};

void fun(std::pair<int, B>& p) {
    cout << "B val: " << p.second.getVal() << endl;
}

void fun2(B& b) {
    cout << "B val: " << b.getVal() << endl;
}

int main(int argc, const char *argv[])
{

    map<int, C> m;
    m.insert(make_pair(1, C()));
    m.insert(make_pair(2, C()));

    //fun(*(m.begin())); // <---- Compilation error
    fun2(m.at(1)); // Works correctly

    return 0;
}

代码编译成功并在我调用fun2时按预期工作。但是,如果我取消注释行fun(*(m.begin()),我会收到以下编译错误:

a.cpp: In function ‘int main(int, const char**)’:
a.cpp:48:18: error: invalid initialization of reference of type ‘std::pair<int, B>&’ from expression of type ‘std::pair<const int, C>’
  fun(*(m.begin()));
                  ^
a.cpp:33:6: error: in passing argument 1 of ‘void fun(std::pair<int, B>&)’
 void fun(std::pair<int, B>& p) {

有没有办法让编译器以多态方式处理std::pair的第二个元素?

P.S。对不起,如果标题以任何方式误导。无法找到更好的表达方式。

1 个答案:

答案 0 :(得分:1)

此:

 *(m.begin())

计算到无名的临时对象。要将它绑定到引用,引用必须是const,所以:

 void fun(const std::pair<int, B>& p) {

并且对于调用getVal()的函数,它也必须是const:

 int getVal() const {return val2;}