我正在嘗試使用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