2017-04-19 128 views
0

我有一些共享文件,我想在两个具有相同编译目标并且非常相同的程序A和B之间使用。C++组合命名空间

所以,我试图将它们分成两个命名并创建一个共享命名空间的共享文件

Interfaces.h

namespace ns_s { 
    class SomeClass; 
    class IFoo { 
     virtual void bar(SomeClass*) = 0; 
    }; 
} 

SomeHeaderinA.h

#include "Interfaces.h" 

namespace ns_a { 
using namespace ns_s; 

    class Foo : public IFoo { 
     virtual void bar(SomeClass* p) override { ... } 
    }; 

} 

但是编译器现在抱怨我的成员函数栏没有覆盖任何东西,所以它似乎没有看到接口实现。 这是为什么?为什么编译器还没有抱怨缺失的IFoo类呢?

编辑: 看起来我错过了导致问题的重要部分。我预先声明了一个类,它是接口方法的一个参数。现在我已经在共享命名空间中预先声明了,并且在namsepace中实际声明了这些事情已经不再一样了。

有没有很好的方法来解决这个问题?只有一小部分接口具有在一个或另一个名称空间(A或B)中定义的参数,所以我可以在每个接口中留下不同的实现,但如果可能的话,将它全部放在共享空间中将会很好一个干净的时尚。

这里是一个链接 http://coliru.stacked-crooked.com/a/79fa58e50e7b8637

+0

无法重现http://coliru.stacked-crooked.com/a/567d40d34199af73 – aschepler

+0

其实如果抱怨只有重载函数,那么它一定是发现了一些IFoo声明,也许不是你想要的那个 –

+0

哦,谢谢。所以,我认为这意味着我从根本上做正确的事情,但在某个地方做错了。这有助于了解 – chrise

回答

0

问题

如在链接代码所示,该问题由SomeClass引起的。

线

class SomeClass{}; 

声明并在命名空间定义ns_aSomeClass。它没有在名称空间ns_s中定义SomeClass

类别ns_s::IFoo::bar的声明使用ns_s::SomeClass

类别ns_a::IFoo::bar的声明使用ns_a::SomeClass

这就是覆盖是一个错误。

解决方案

您可以修复它:

  1. ns_a,或
  2. 拆除的SomeClass的定义ns_a声明:: IFoo的::酒吧使用ns_s::SomeClass

namespace ns_a { 

    using namespace ns_s; 

    class Foo : public IFoo { 
    virtual void bar(SomeClass* p) override {} 
    }; 
} 

namespace ns_a { 

    using namespace ns_s; 

    class SomeClass{}; 

    class Foo : public IFoo { 
    virtual void bar(ns_s::SomeClass* p) override {} 
    }; 
} 
+0

是的,我意识到这一点。因此,问题可能改变为我如何解决这个问题;) – chrise