2010-08-24 164 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; 
}