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

标签 c++ clang redefinition

<分区>

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

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

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 的声明和实现中使用相同的类。

关于c++ - 将 'WhatEver' 重新定义为不同类型的符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21797251/

相关文章:

c++ - libclang 返回太多关于函数声明的信息

c - typedef 重定义如何在 C11 中工作?

c++ - 为什么我们实际上有虚函数?

c++ - 从 QRessource 加载的文件中提取绝对文件路径

android-ndk 构建无法链接 boost 系统

c++ - 重载 operator<< 用于文本渲染

C++重新定义

c++ - STL独立初始化列表

c++ - 在 constexpr 中使用 strcmp 的编译器差异

c++ - CLang Libtooling:获取 clang::VarDecl、clang::FieldDecl 或 clang::ParmVarDecl 内变量的数据类型