gpt4 book ai didi

c++ - 在 C++ 中如何解决这些名称冲突?

转载 作者:太空狗 更新时间:2023-10-29 20:00:33 25 4
gpt4 key购买 nike

假设我有这个物理结构:

/
+-- conflicttest
| +-- A.cpp
| +-- A.h
| +-- main.cpp
+-- libconflict
| +-- conflict
| | +-- A.h
| | +-- B.h
| +-- A.cpp
| +-- B.cpp

这些是libconflict的来源,深吸一口气:

libconflict 中的

B 类 header :

// libconflict B.h
class B
{
public:
void bar();
protected:
int j_;
};

B 类 libconflict 中的实现:

// libconflict B.cpp
#include "conflict/B.h"

void B::bar()
{
std::cout << "B::bar" << std::endl;
}
libconflict 中的

A 类 header :

// libconflict A.h
# include "conflict/B.h"

class A : public B
{
public:
A();
private:
int i_;
};

A 类 libconflict 中的实现:

#include "conflict/A.h"

A::A()
{
std::cout << "libconflict A is alive" << std::endl;
i_ = 51; // some random fields and values... I should admit I am lost
j_ = 47;
}

现在conflicttest的sources,差不多就结束了:

冲突测试中的

A 类 header :

// conflicttest A.h
class A
{
public:
A();
void foo();
};

class A 冲突测试中的实现:

// conflicttest A.cpp
#include "A.h"

A::A()
{
std::cout << "A is alive" << std::endl;
}

void A::foo()
{
std::cout << "A::foo" << std::endl;
}

最后,main.cpp:

// main.cpp in conflicttest
#include "conflict/A.h"

int main()
{
B* b = new A;
b->bar();
return 0;
}

呼...我正在使用 Visual Studio 2010 构建此解决方案。 conflicttest 是一个链接到静态库 libconflict 的可执行文件。这编译就像一个魅力,但是,不管你信不信,输出是:

A is alive
B::bar

链接器实际上使用了 conflicttest 中的符号 A,它绝对不是 B,更糟糕的是,它可以调用 B: :bar().

我迷路了,为什么编译器不报错?

最佳答案

您违反了One Definition Rule .

编译器没有提示,因为它在跨越翻译单元边界时可以检测到的东西有限。

关于c++ - 在 C++ 中如何解决这些名称冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6346678/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com