2017-04-19 126 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