将'WhatEver'重新定义为不同类型的符号

redefinition of 'WhatEver' as different kind of symbol

本文关键字:同类型 符号 WhatEver 新定义 定义      更新时间:2023-10-16

我正在尝试将一些遗留代码迁移到一个较新的项目中,但我并没有真正修复这个问题。代码在旧环境中编译并运行良好。

我有一个包含这些定义的头文件:

std::string ToString(shared_ptr<const SomeObject> obj);
std::string ToString(SomeObject* obj);

以及包含以下行的实现文件:

using namespace std;
string ToString(shared_ptr<const SomeObject> obj)
{
  // code cut
  return outstring.str();
}
string ToString(SomeObject* obj)
{
  // code cut
  return outstring.str();
}

我正在尝试用clang编译它,但出现以下重定义错误:

.../Filename.cxx:15:8: error: redefinition of 'ToString' as different
      kind of symbol
string ToString(shared_ptr<const SomeObject> obj)
       ^
.../Filename.h:15:13: note: previous definition is here
std::string ToString(SomeObject* obj);

为什么它被重新定义为不同类型的符号?我应该如何解决这个问题?最后但并非最不重要的一点是,为什么它适用于较旧的编译器?

检查是否声明了stringshared_ptr,并尝试为它们指定命名空间(将shared_ptr替换为 boost::shared_ptrstd::shared_ptr ),以确保在声明和实现ToString时使用相同的类。