gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:08:42 25 4
gpt4 key购买 nike

我正在尝试使用 pimpl 模式并在匿名命名空间中定义实现类。这在 C++ 中可能吗?我失败的尝试如下所述。

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

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);
}

最佳答案

不,必须至少在使用指针类型之前声明类型,将匿名命名空间放在 header 中不会真正起作用。但是你为什么要这样做呢?如果你真的真的很想隐藏实现类,将其设为私有(private)内部类,即

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

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

Foo::Foo() : pimpl(new FooImpl) { }

关于c++ - pimpl 是否与匿名命名空间兼容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5745608/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com