我正在尝试使用pimpl模式并在匿名命名空间中定义实现类。这在C++中可能吗?我的失败尝试如下所述。pimpl与匿名命名空间兼容吗?
有没有可能解决这个问题,而无需将实现移动到名称空间(或全局名称空间)?
class MyCalculatorImplementation;
class MyCalculator
{
public:
MyCalculator();
int CalculateStuff(int);
private:
MyCalculatorImplementation* pimpl;
};
namespace // If i omit the namespace, everything is OK
{
class MyCalculatorImplementation
{
public:
int Calculate(int input)
{
// Insert some complicated calculation here
}
private:
int state[100];
};
}
// error C2872: 'MyCalculatorImplementation' : ambiguous symbol
MyCalculator::MyCalculator(): pimpl(new MyCalculatorImplementation)
{
}
int MyCalculator::CalculateStuff(int x)
{
return pimpl->Calculate(x);
}
这是我使用时间最长,也是如此,直到有人向我指出,如果出口类'Foo',还出口类'美孚: :FooImpl',这通常不是你想要的... – 2011-04-21 14:56:39
@mmutz是否_export_表示与MS有关的'__declspec(dllexport)'?如果是的话,我可能不需要担心。 – anatolyg 2011-04-21 15:01:45
@anatolyg:是,或'__attribute __((visibility = default))'在GCC/ELF系统上。 – 2011-04-21 15:04:17