Estoy tratando de usar el patrón pimpl y definir la clase de implementación en un espacio de nombre anónimo. ¿Es esto posible en C++? Mi intento fallido se describe a continuación.¿Es pimpl compatible con espacios de nombres anónimos?
¿Es posible arreglar esto sin mover la implementación a un espacio de nombre con un nombre (o el global)?
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);
}
Esto es lo que he usado durante mucho tiempo, demasiado, hasta que alguien me señaló que si exporta clase 'foo', también exporta clase' Foo: : FooImpl', y eso generalmente no es lo que quiere ... –
@mmutz ¿_export_ significa '' __declspec relacionado con MS (dllexport) '? Si es así, probablemente no tenga que preocuparme. – anatolyg
@anatolyg: yes, o '__attribute __ ((visibility = default))' en sistemas GCC/ELF. –