今天,我对这个代码片段有一个不明确的名称引用感到震惊:
class A
{
private:
typedef int Type;
};
class B
{
public:
typedef int Type;
};
class D : A, B
{
Type value;//error: reference to 'Type' is ambiguous
};
嗯!假设你是A
类的作者,并且你的类已经被不同的人和不同的项目到处使用。有一天,你决定重写你的A
类。这难道不意味着你不能在不破坏他人代码的情况下在新类中使用任何新的(甚至是私有的(名称吗?
这里的惯例是什么?
是的,你是对的。如果您决定以后进行更改,使用当前的格式/逻辑/编码样式可能会破坏其他人的代码。请尝试使用PIMPL或完全限定符号。你的例子很好地说明了为什么不使用完全限定符号不是一个好主意。这与以下代码的问题相同:
using namespace std;
上面的代码行可能会破坏很多东西。
正如@Jarod42所提到的,它需要遵循pimpl习惯用法(指向实现的指针(来分离接口和实现:
A.h
#include <memory>
class A
{
public:
A();
~A();
private:
class AImpl;
std::unique_ptr<AImpl> pimpl;
};
A.cpp
#include "A.h"
class A::AImpl
{
private:
typedef int Type;
/* .. */
};
A::A(): pimpl(new AImpl)
{
}
A::~A() = default;
main.cpp
#include "A.h"
class B
{
public:
typedef int Type;
};
class D : A, B
{
Type value;
};
我认为这里没有问题,符号不存在并不是因为它是私有的。如果你试图访问一个私有成员,编译器告诉你不能访问它,而不是不存在。
此外,我想说,使用多重继承而不完全限定符号是一种糟糕的做法。
class D : A, B
{
B::Type value;
};