我正在尝试将一些遗留代码迁移到一个较新的项目中,但我并没有真正解决这个问题。代码在旧环境中编译并运行良好。
我有一个包含以下定义的头文件:
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);
为什么重新定义为不同类型的符号?我该怎么解决这个问题?最后但并非最不重要的是,为什么它适用于较旧的编译器?
答案 0 :(得分:2)
检查是否声明了string
和shared_ptr
,并尝试为它们指定名称空间(将shared_ptr
替换为boost::shared_ptr
或std::shared_ptr
)以确保同一类用于ToString
的声明和实现。