如何在多个类中定义相同的命名结构?

时间:2017-08-10 17:22:33

标签: c++ visual-studio-2013

我正在使用多个工程师的多个课程,他们在课程中使用相同的命名结构。由此我得到错误"' struct'类型重新定义"。我该如何解决这个问题?

示例:

RewriteRule ^(vendor)/(\w+)$ $1/index.php?handle=$2 [L]

// Eng1Class.h
#pragma once

struct Eng1And2SameName
{
    unsigned int bottle;
};

class Eng1Class
{
public:
    Eng1Class();
    ~Eng1Class();
};

// Eng2Class.h
#pragma once

struct Eng1And2SameName
{
    float x, y;
};

class Eng2Class
{
public:
    Eng2Class();
    ~Eng2Class();
};

错误:错误C2011:' Eng1And2SameName' :' struct'类型重新定义

根据这个Compile error "'struct' type redefinition" although it's the first definition for it,#pragma曾经应该解决问题,但我仍然看到错误。您可以提供任何见解?

3 个答案:

答案 0 :(得分:2)

不,#pragma once可防止多次包含头文件 - 每次都包含一次 - >重新定义。

  

它们在类

中具有相同的命名结构

*头文件

未在类(嵌套)中定义,但它们可以是:

class Eng1Class
{
public:
    struct Eng1And2SameName
    {
        unsigned int bottle;
    };

    Eng1Class();
    ~Eng1Class();
};

或者您可以将这些标题的内容括在两个不同名称的namespace s。

答案 1 :(得分:0)

定义命名空间会有所帮助

例如,您在同一个名称范围内使用相同的结构定义表示错误。 报告错误 enter image description here

您可以通过定义namesapce

来实现
#include<iostream>
using namespace std;

namespace Eng1 {
    struct Eng1And2SameName
    {
        unsigned int bottle;

    };
}

namespace Eng2
{

    struct Eng1And2SameName
    {
        float x, y;
    };
}

int main()
{
    Eng1::Eng1And2SameName a;
    Eng2::Eng1And2SameName b;

    return 0;
}

答案 2 :(得分:0)

通常,工作在同一产品上的工程师会以某种方式进行协调,至少他们会使用公共源代码存储库和公共构建。因此,冲突应该更早出现。

&#34;不协调&#34;工程师可能会在他们处理不同产品时发生,如果是这样,每个产品都可能拥有自己的命名空间。因此,您可以在没有冲突的情况下组合产品:

// in a header:
namespace Eng1Class {

    struct Eng1And2SameName
    {
        unsigned int bottle;
    };

    class EngClass
    {
    public:
        EngClass();
        ~EngClass();
    };

}

// in the cpp-file
Eng1Class::EngClass::EngClass() {
    cout << "hello, Class 1";
}

// in another (or even the same) header
namespace Eng2Class {

    struct Eng1And2SameName
    {
        float x, y;
    };

    class EngClass
    {
    public:
        EngClass();
        ~EngClass();
    };
}

// in another (or even the same) cpp-file
Eng2Class::EngClass::EngClass() {
    cout << "hello, Class 2";
}