C ++运算符的多重定义>>

时间:2011-04-18 12:03:08

标签: c++ parsing csv include dependency-management

我正在使用@Martin提出的csv parsing with C++解决方案,因为我正在努力避免使用像boost这样的库来解决我当前的项目。我已将他的实现放在“csv.h”标题中,并尝试将其包含在其他一些文件中。我一直收到以下错误

multiple definition of operator>>(std::basic_istream<char, std::char_traits<char> >&, CSVRow&)

当我尝试构建项目时 - 我假设发生了这种情况,因为operator>>的重新定义与原始版本冲突。我怎么能让这两个玩得好听?感谢。

4 个答案:

答案 0 :(得分:8)

有可能你有多个编译单元(即cpp文件)中包含相同的运算符,所以你得到的代码生成相同,链接器比查看所有.obj文件将它们拉到一起并看到倍数。

您有3个选择:

  • 将其标记为静态 - 这将使 操作员只对文件可见 它在。
  • 将其标记为内联 - 这样就可以了 摆脱功能并插入 代码在使用点。
  • 把 头部和身体的原型 在自己的cpp文件中。

答案 1 :(得分:4)

  

我已将他的实现放在“csv.h”标题

这就是问题所在。请将其放在csv.cpp文件中。 : - )

答案 2 :(得分:2)

将其标记为内联。

inline istream & operator>>( istream & is, CSVRow & row ) {
    // stuff
}

答案 3 :(得分:0)

更好的是,您可以将代码与库代码分开,您可以在项目中创建一个包含C ++文件和标题的文件夹。然后,您可以在Makefile / Makefile.am / CMakeLists中创建一个静态存档(.a),您可以在完成后链接到主程序。

这种方式更清晰,代码是独立的,并且可重用的组件并不真正依赖于任何其他东西(如果您选择遵循此模式,那么文件夹层次结构可能是有用的一件事。)< / p>