包括同一类的不同版本

时间:2016-04-04 19:15:28

标签: c++ visual-c++

我今天下午大部分时间都在追踪一个错误,该错误基本上归结为在Visual Studio 2015中声明同一个类的同一个头文件的两个不同版本。大大简化后,它显示如下;

oldcamera.h

#pragma once

class camera
{
public:
 camera();
 int a;
 double x,y,z;
};

camera.h

#pragma once

class camera
{
public:
 camera();
 double x,y,z;
};

camera.cpp

#include camera.h

camera::camera()
{
  x = y = 0;
  z = 1;
};

mytransclass.h

#pragma once

#include "oldcamera.h"

class trans
{
public:
   camera m_camera;
};

func.cpp

#include "mytransclass.h"

void MyFunc(trans *ptrans)
{
  ptrans->x = 1.0;
  ptrans->y = 2.0;
  ptrans->z = 3.0;
}

该项目包括camera.cpp和func.cpp,当单步执行MyFunc时,调试器显示分配实际上没有做任何事情。问题是这是否应该在没有警告的情况下进行编译和链接,如果它是合法的(知道可能存在c ++的复杂遗产),为什么分配失败?如果它是合法的,有没有办法将其标记为错误?编译器是Visual C ++ 2015。

2 个答案:

答案 0 :(得分:1)

当您#include某事时,您基本上将该文件复制并粘贴到#include d的位置。具有相同类定义的多个实际上并不是错误,只要它们不是包含在同一编译单元(cpp)中的相同类定义的多个。如果你这样做,它会破坏一个定义规则。

在你的设置中,oldcamera.h中Camera版本中的函数正在调用为camera.h编写的函数(因为这些函数是唯一被编译的函数,因为你说oldcamera.cpp不是该项目)。但是,这些功能依赖于Camera类的数据布局是某种方式。由于oldcamera.h Camera和新camera.h' Camera具有不同的数据布局(您没有证明,但我和#39; m假设),狗屎袭击了粉丝。

答案 1 :(得分:1)

您的程序违反了One Definition Rule,特别是([basic.def.odr] / 6):

  

类型中可以有多个定义(第9条),......在程序中提供每个定义   出现在不同的翻译单元中,并且定义满足以下要求。特定   这样一个名为D的实体在多个翻译单元中定义,然后是   (6.1) - D的每个定义应由相同的令牌序列组成   ...
  如果D的定义不满足这些要求,则行为未定义。