代码之家  ›  专栏  ›  技术社区  ›  Amir Rachum

奇怪的多重定义错误

c++
  •  3
  • Amir Rachum  · 技术社区  · 14 年前

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

    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 回复  |  直到 14 年前
        1
  •  4
  •   Puppy    14 年前

    几乎可以肯定,代码包含在多个头文件中,而不是在头文件中声明并在源文件中定义。您需要以内联方式声明函数、对其进行模板化,或者将定义移动到源文件中,但将声明保留在头文件中。

        2
  •  1
  •   Karel Petranek    14 年前

    您的问题是,您可能在.h文件中有此代码,并将其包含到更多的.cpp文件中。解决方案是使用inline关键字使编译器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文件。