gpt4 book ai didi

c++ - 友元运算符重载导致 "already defined in"链接器错误

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

我偶然发现了一个我可以解决的问题,但我不确定为什么它不起作用。

这是我尝试使用的代码。为简洁起见,字段已被删除。让我知道是否需要它们,我会把它们放回去:

#pragma once
#ifndef __PageStyle__
#define __PageStyle__
class PageStyle
{
public:
friend bool operator<(const PageStyle& lhs, const PageStyle& rhs);
};

bool operator<(const PageStyle& lhs, const PageStyle& rhs)
{
return (lhs.name < rhs.name);
}
#endif

在我的源文件中我做了这样的事情:

#include "PageStyle.h"

...
void PageStyleManager::loadPageStyles() {
std::set<PageStyle> pageStyles;
...
}

代码编译正常,但链接器吐出:

1>PageStyleManager.obj : error LNK2005: "bool __cdecl operator<(class PageStyle const &,class PageStyle const &)" (??M@YA_NABVPageStyle@@0@Z) already defined in BaseContentFiller.obj

BaseContentFiller 是 PageStyleManager 以及其他以类似方式使用 PageStyle 的类的基类。

在进一步研究之后,我发现出于我的目的(在 STL 集中使用该类)我根本不需要非成员好友版本。 我将运算符(operator)设置为在线公共(public)成员,代码链接没有问题

为什么会出现这个问题?我确保我使用了 header guards,这是我第一次真正体验运算符重载,我想知道我做错了什么。

最佳答案

如果您在头文件中包含函数的定义,它会在每个 Translation unit 中得到定义。 包含头文件的地方。
这违反了 One Definition Rule 因此链接器错误。

请注意,头文件保护或 #pragma once 只是防止同一个头文件多次包含在同一个源文件中,而不是在不同的 TU 中定义它。

有两种方案可以解决这个问题:

  1. 只需在头文件中添加声明,在一个cpp文件中添加定义或
  2. 将 header 中定义的函数设为内联

关于c++ - 友元运算符重载导致 "already defined in"链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9274753/

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