隐藏实现成员函数(如静态全局函数)的
问题描述:
让我们假设你有相同内容的两种实现源文件:隐藏实现成员函数(如静态全局函数)的
// foo{a,b}.cpp
class Foo {
public:
void bar();
}
void Foo::bar() { std::cout << "bar\n"; }
实现一个正常功能(不是成员方法),我只想庆祝这个方法为static
。但是这对方法声明有不同的含义,不能在实现中指定。
如何更改foob.cpp
,以便在编译和链接两个文件时不会出现链接器错误?
答
你可以把整个的具名命名空间
// foo{a,b}.cpp
namespace
{
class Foo {
public:
void bar();
}
void Foo::bar() { std::cout << "bar\n"; }
}
类将不可见之外,只能在当前转换单元中使用。
+0
缺点是,'Foo'的公共接口丢失了。我不确定这是否解决了OP的问题。 –
+0
这个工程,谢谢! :) @πάνταῥεῖ我不确定'Foo'是否意味着它的公共接口失效。我想在'namespace {}中包装的那个只在'foob.cpp'文件中声明和使用。 –
答
正常的解决方案是从foob.cpp
删除Foo::bar()
的定义。
哦......我想说“把包含文件放在名称空间中”,但后来我读[this](http://stackoverflow.com/a/9765654/1016716)。哦,我确定有一个很好的答案。 –
嗯,我不能完全看到你真的想在这里解决哪个问题,但它闻起来像[pimpl成语](https://en.wikipedia.org/wiki/Opaque_pointer#C.2B.2B)应该是正确的路要走(假设'Foo'已经有公开声明)。 –
为什么要编译两个具有相同内容的实现源文件?为什么不有条件地编译你想用来避免重复定义的_one_? –