pimpl是否与匿名命名空间兼容?

ana*_*lyg 5 c++ namespaces pimpl-idiom

我试图使用pimpl模式并在匿名命名空间中定义实现类.这在C++中是否可行?我失败的尝试描述如下.

是否可以在不将实现移动到具有名称(或全局名称)的命名空间的情况下解决此问题?

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);
}
Run Code Online (Sandbox Code Playgroud)

Cat*_*lus 6

不,必须至少在使用指针类型之前声明类型,并且在标头中放置匿名命名空间将不会真正起作用.但无论如何,你为什么要这样做呢?如果你真的想隐藏实现类,那就把它变成私有的内部类,即

// .hpp
struct Foo {
    Foo();
    // ...
private:
    struct FooImpl;
    boost::scoped_ptr<FooImpl> pimpl;
};

// .cpp
struct Foo::FooImpl {
    FooImpl();
    // ...
};

Foo::Foo() : pimpl(new FooImpl) { }
Run Code Online (Sandbox Code Playgroud)