首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >方法在使用新版本的Visual时已经定义。

方法在使用新版本的Visual时已经定义。
EN

Stack Overflow用户
提问于 2022-03-09 19:40:44
回答 1查看 107关注 0票数 0

以下文件是我的C++项目的一部分。

代码语言:javascript
复制
// DpValue.h

class DpValue {
public:
   class RElement {
   public:
      virtual bool operator==(RElement const &Other) const = 0;
   };
};

template<class T>
class DpElement : public DpValue::RElement {
public:
   virtual bool operator==(DpValue::RElement const &Other) const { ... }
};
代码语言:javascript
复制
// DpValue.cpp

#include <DpValue.h>

template<>
bool DpElement<DpValue>::operator==(DpValue::RElement const &Other) const { ... }
代码语言:javascript
复制
// DpType.cpp

#include <DpValue.h>

...

它在Visual 2015中编译得很好。我正在更新到Visual 2022,在这里我得到了以下链接器错误:

代码语言:javascript
复制
Code: LNK2005
Description: "public: virtual bool __cdecl DpElement<class DpValue>::operator==(class DpValue::RElement const &)const " (??8?$DpElement@VDpValue@@@@UEBA_NAEBVRElement@DpValue@@@Z) already defined in DpKernel64Dbg.lib(DpValue.obj)
Project: DpDiagram
File: DpKernel64Dbg.lib(DpType.obj)

据我理解,该方法是在DpValue.obj中定义的,这是正确的。但是,在DpType.obj中再次定义了它!是什么原因造成的?

当然,我的项目中还有很多其他代码和文件,但是我已经包含了我认为与错误相关的所有内容。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-09 21:04:03

我认为您唯一缺少的是头文件中显式专门化的声明。它必须出现在隐式实例化类专门化的任何点之前(因为函数是virtual)。在显式专门化声明存在的情况下,应该禁止隐式实例化。

因此,在DpValue.h的定义之后添加DpElement

代码语言:javascript
复制
template<>
bool DpElement<DpValue>::operator==(DpValue::RElement const &Other) const;

它必须立即遵循类模板定义,以避免类的意外隐式实例化,这也可能隐式实例化虚拟成员函数的定义。

另见Explicit specialization of member function template in source file

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71415131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档