2010-08-24 55 views
0

File1.h運行時間分辨率C++命名空間衝突

// Declaration 
Class A 
{ 
void Func(); 
} 
//Along with some other stuff 

File1.cpp

//Definition 
A::Func() 
{ 
} 

// Along with some other stuff 

File2.h

class A 
{ 
void Func(); 
} 

File2.cpp

// Definition 
File2::A::Func() 
{ 
} 

File3.cpp 
#include "File1.h" 
#include "File2.h" 
// 
Invokes Func() 

Main1.cpp Main2.cpp

Main1.cpp File3.cpp和File2.cpp被建立起來
Main1.cpp File3.cpp和File1.cpp構建在一起
我想調用Func()取決於不同ent linkage
但是,它給我編譯時錯誤。
我該如何解決編譯時錯誤?
有沒有解決上述問題的標準方法?

如果我使用File1和File2命名空間,那麼我將無法動態調用 。注意:我無法更改File1.h

+0

您可能想要在您的問題中包含編譯錯誤。 – imaginaryboy 2010-08-24 04:19:02

+3

你能解釋一下你希望如何利用這些重複的類定義和「動態調用」嗎?現在,這感覺就像一件永遠不會按需要工作的東西。 – TheUndeadFish 2010-08-24 04:22:09

+1

File1和File2不是名稱空間。命名空間沒有運行時間解析。 C++中的類從「class」開始,而不是「Class」。函數的定義需要指定返回類型等等... – Chubsdad 2010-08-24 04:48:03

回答

0

與Java(例如)強制類和文件名之間的1:1對應關係不同,C++基本上完全忽略了文件名。因此,要解決你的兩個類(並重命名爲A)之間的衝突,你可以使用命名空間:

//file1.h: 
class A 
    void Func(); 
}; 

//file1.cpp: 
A::Func() {} 

//file2.h: 
namespace f2 { 
class A { 
    void Func(); 
}; 
} 

// file2.cpp: 

namespace f2 { 
    A::Func() {} 
} 

// main.cpp 
#include "file1.h" 
#include "file2.h" 

int main() { 
    A f1a; 
    f2::A f2a; 

    f1a.Func(); // invokes Func declared in file1.h, which is in global namespace 
    f2a.Func(); // invokes Func declared in file2.h, which is in namespace f2 
    return 0; 
} 

目前尚不清楚你通過動態調用的意思。動態調用聽起來很像使用一個多態函數,它需要一個公共基類:

struct base { 
    virtual void Func() = 0; 
}; 

struct A1 : public base { 
    virtual void Func() {} 
}; 

struct A2 : public base { 
    virtual void Func() {} 
}; 

int main() { 
    A1 a1; 
    A2 a2; 
    base *b[2] = { &a1, &a2 }; 

    b[0]->Func(); // invokes A1::Func() 
    b[1]->Func(); // invokes A2::Func() 
    return 0; 
}