2016-07-06 121 views
0

让我们假设你有相同内容的两种实现源文件:隐藏实现成员函数(如静态全局函数)的

// foo{a,b}.cpp 
class Foo { 
public: 
    void bar(); 
} 
void Foo::bar() { std::cout << "bar\n"; } 

实现一个正常功能(不是成员方法),我只想庆祝这个方法为static。但是这对方法声明有不同的含义,不能在实现中指定。

如何更改foob.cpp,以便在编译和链接两个文件时不会出现链接器错误?

+0

哦......我想说“把包含文件放在名称空间中”,但后来我读[this](http://stackoverflow.com/a/9765654/1016716)。哦,我确定有一个很好的答案。 –

+0

嗯,我不能完全看到你真的想在这里解决哪个问题,但它闻起来像[pimpl成语](https://en.wikipedia.org/wiki/Opaque_pointer#C.2B.2B)应该是正确的路要走(假设'Foo'已经有公开声明)。 –

+0

为什么要编译两个具有相同内容的实现源文件?为什么不有条件地编译你想用来避免重复定义的_one_? –

回答

4

你可以把整个的具名命名空间

// 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'文件中声明和使用。 –

0

正常的解决方案是从foob.cpp删除Foo::bar()的定义。