奇怪的多重定义错误

时间:2010-08-22 12:11:02

标签: c++

我的代码中有这样的内容:

namespace A {
namespace B {

void
GetLine(std::istream& stream, std::string& line)
{
    line.clear();
    while (stream.good()) {
        std::getline(stream, line);
        boost::trim(line);
        if (not line.empty()) break;
    }
    boost::to_upper(line);
}

}
}

每当我拨打A::B::GetLine时,我都会收到多个定义错误。任何想法为什么?

(代码正在运行,因此如果您需要更多信息,我会尝试提供特定的代码段,但我不能只是在这里填写整个代码。)

2 个答案:

答案 0 :(得分:4)

您几乎肯定会将代码包含在多个标头中,而不是在标头中声明并在源文件中定义。您需要声明函数内联,模板化,或将定义移动到源文件中,但将声明留在标题中。

答案 1 :(得分:1)

您的问题是您可能在.h文件中包含此代码并将其包含在更多.cpp文件中。解决方案是使用inline关键字使编译器内联并删除引用:

namespace A {
namespace B {

inline void
GetLine(std::istream& stream, std::string& line)
{
    line.clear();
    while (stream.good()) {
        std::getline(stream, line);
        boost::trim(line);
        if (not line.empty()) break;
    }
    boost::to_upper(line);
}

}
}

另一种解决方案是将方法体移动到.cpp文件。

相关问题