首页 文章

在头文件中有全局函数定义,避免重复的符号链接错误

提问于
浏览
10

我在头文件中有以下代码 .

#pragma once

class error_code {
public:
    unsigned __int64 hi;
    unsigned __int64 lo;    
};

std::ostream& operator<< (std::ostream& o, const error_code& e) {
    return o << "[" << e.hi << "," << e.lo << "]";
}

我得到链接错误,当项目中有2个cpp包含此头文件时 .

错误LNK2005:“类error_code __cdecl运算符|(类error_code const&,类ViTrox :: error_code const&)”(?? U @@ YA?AVerror_code @ 0 @ ABV10 @ 0 @ Z)已在xxx.obj中定义

我知道如果我将 operator<< 的定义移动到cpp文件或DLL文件,我可以解决这个问题 .

但是,我只想将它们放在 SINGLE 头文件中 . 有没有什么技术可以达到这个目的?或者我必须将定义分离到另一个文件?

4 回答

  • -1

    使用 inline 关键字 .

    inline std::ostream& operator<< (std::ostream& o, const error_code& e) {
        return o << "[" << e.hi << "," << e.lo << "]";
    }
    
  • 7

    使函数 inline

    inline std::ostream& operator<< (std::ostream& o, const error_code& e) {
        return o << "[" << e.hi << "," << e.lo << "]";
    }
    

    或使其成为模板功能:

    template<class Ch, class Tr>
    std::basic_ostream<Ch,Tr>& operator<< (std::basic_ostream<Ch,Tr>& o,
                                           const error_code& e) {
        return o << "[" << e.hi << "," << e.lo << "]";
    }
    
  • 3

    你可以使函数 static . 它指定内部链接,因此链接器不关心函数是否已在其他转换单元中定义 .

    或者,如前所述,您可以将其设为 inline . 它仍然具有外部链接,但该标准允许外部内联函数在多个翻译单元中具有定义 .

  • 17

    在.cpp文件中定义此函数(不在.h文件中)

    //yoursource.cpp
    #include "yourheader.h"
    
    std::ostream& operator<< (std::ostream& o, const error_code& e) {
        return o << "[" << e.hi << "," << e.lo << "]";
    }
    

相关问题