2016-11-29 62 views
0

我创建了2个头文件。 ListA.h和ListN.h重新定义错误:使用相同类名称的不同.h文件

他们都自己使用自己的独特的类列表。当我编译我的程序(即使他们无法知道另一个存在,它说下面的错误)

enter image description here 我很确定它不应该是一个重新定义,但它显然是。任何帮助表示赞赏。


ListA.h

#ifndef __LISTA_H_ 
#define __LISTA_H_ 
#include <iostream> 

using namespace std; 
class List{ 
     public: 
       List(int = 0); 
       List(const List&); 
       ~List(); 
}; 
#endif 

ListN.h

#ifndef __LISTN_H_ 
#define __LISTN_H_ 
#include <iostream> 

using namespace std; 

class List{ 
     public: 
       List(int = 10); 
       List(const List&); 
       ~List(); 
};  
#endif 

ListA.cpp

#include "ListA.h" 
using namespace std; 

List::List(int mySize) 
{ 
    //... 
} 

ListN.cpp

#include "ListN.h" 
#include <iostream> 
using namespace std; 
List::List(int size) 
{ 
    //... 
} 

主要

#include <iostream> 
#include "ListN.h" 
using namespace std; 

int main() 
{ 
    List myList; 
    return 0; 
} 
+1

它们都在同一个项目中,_might_与它有关。 –

+0

** [basic.def.odr] **“给定一个名为D的实体定义在多个翻译单元中,那么D的每个定义都应包含相同的标记序列......”你违反了这个规则,一个名为'List'的实体在不同的翻译单元中定义不同。 –

回答

0

当连接器试图链接找到列表定义/符号,它在两个不同的OBJ文件发现因此连接器提供者错误。在Visual Studio中的错误编号:LNK2005

为了解决这个错误,或者:

  1. 要修复,添加/FORCE:MULTIPLE到链接器命令行选项
  2. 添加类在两个不同的命名空间,这将避免该错误。

ListN.h

#ifndef __LIST_H_ 
#define __LIST_H_ 
#include <iostream> 

using namespace std; 

namespace ListN 
{ 
    class List{ 
    public: 
     List(int = 10); 
     List(const List&); 
    }; 
} 

#endif 

ListN.cpp

#include "ListN.h" 
#include <iostream> 

using namespace std; 

namespace ListN 
{ 
    List::List(int size) 
    { 
     //... 
    } 
} 

Main.cpp的

#include <iostream> 
#include "ListN.h" 
int main() 
{ 
    ListN::List myList; 
    return 0; 
} 
+0

现在的主文件说List没有在范围 –

+0

中声明使用用户之前的命名空间像我的情况ListN :: List。或者使用名称空间ListN添加。 – Swapnil

+0

@GunnerStone检查更新的答案。 – Swapnil

0

这两个cpp文件都由编译器编译。因此,当链接器将文件链接到一起时,它会变得混乱,因为有多个类。

为了解决这个问题,你可以使用命名空间,或者你冷不要暴露至少一个List类。


另外,如果当时的想法是能够包括ListN.h VS ListA.h用于配置目的,这是错误的方式这样做。您应该为标头设置#define参数,或者您应该找到其他方法,例如通过#ifdef。例如(我不是100%肯定这将编译,但你的想法):

List.h

#ifndef __LIST_H_ 
#define __LIST_H_ 

#ifndef LIST_PARAM 
#define LIST_PARAM 0 
#endif 

#include <iostream> 

using namespace std; 

class List{ 
     public: 
       List(int = LIST_PARAM); 
       List(const List&); 
       ~List(); 
};  
#endif 

的main.cpp

#include <iostream> 

#define LIST_PARAM 10 
#include "List.h" 

using namespace std; 

int main() 
{ 
    List myList; 
    return 0; 
} 

我个人不喜欢这种方法;将值传递给构造函数会更好:

int main() 
{ 
    List myList{ 10 }; 
    return 0; 
} 
相关问题