sách gpt4 ăn đã đi

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

In lại 作者:太空狗 更新时间:2023-10-29 20:00:33 25 4
mua khóa gpt4 giày 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
{
công cộng:
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
{
công cộng:
MỘT();
riêng tư:
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
{
công cộng:
MỘT();
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 chính()
{
B* b = new A;
b->bar();
trả về 0;
}

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

A is alive
B::bar

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

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

câu trả lời hay nhất

您违反了One Definition Rule .

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

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

25 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress