假设我有以下设置:
#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。对不起,如果标题以任何方式误导。无法找到更好的表达方式。
答案 0 :(得分:1)
此:
*(m.begin())
计算到无名的临时对象。要将它绑定到引用,引用必须是const,所以:
void fun(const std::pair<int, B>& p) {
并且对于调用getVal()的函数,它也必须是const:
int getVal() const {return val2;}