【问题标题】:redefinition of 'WhatEver' as different kind of symbol [duplicate]将“WhatEver”重新定义为不同类型的符号[重复]
【发布时间】:2014-02-15 12:00:36
【问题描述】:

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

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

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);

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

【问题讨论】:

  • 您能否提供一个重现问题的最小测试用例,包含所有必需的内容?
  • 不幸的是,框架很庞大:-\
  • 那太糟糕了。祝你好运!
  • 我们不需要你的框架。相反,我们需要你做一些工作。复制你的框架。删除东西——首先弄清楚如何编译那个文件并得到错误。现在删除您认为对错误不重要的文件部分。重新编译并得到相同的错误(如果没有,则回滚——使用源代码控制使回滚成为可能)。重复直到代码很小并且错误仍然存​​在。
  • @septi 这两个是您得到的唯一错误吗?确保声明了stringshared_ptr,并尝试为它们指定命名空间(将shared_ptr 替换为boost::shared_ptrstd::shared_ptr)。

标签: c++ clang redefinition


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多