0

矢量仅包含在一个源文件中。头文件中唯一包含的 stl 是字符串。但是我无法摆脱多个定义错误(下面的示例)。有任何想法吗?

./plugin_dfb.o:mipsel-linux-uclibc/include/c++/4.2.0/bits/stl_bvector.h:182: `std::operator-(std::_Bit_iterator_base const&, std::_Bit_iterator_base const&) 的多重定义' ./painter.o:mipsel-linux-uclibc/include/c++/4.2.0/bits/stl_bvector.h:182: 首先在这里定义

4

4 回答 4

1

此 std::operator- 是具有外部链接的内联函数。链接器似乎不支持此类内联函数的多个定义。但是 C++ (ODR) 的“单一定义规则”显然允许这样做。通常,此类符号会获得“弱链接”(GNU 术语),但我认为目标文件格式和链接器都需要支持这一点。

我会尝试在专门针对您的平台的群组/邮件列表中提出问题。类似于“平台 X 在链接方面是否支持 C++ 以及与 C++ 相关的内联函数和模板的单一定义规则?”。

您可能还想查看 GCC 文档。他们可能会提供命令行开关作为解决方法。如果您还没有使用 g++ 作为链接器的前端,您应该尝试一下。也许这也有帮助。

于 2009-12-29T16:09:48.827 回答
0

你试过用#pragma once吗?

于 2009-12-29T11:09:35.520 回答
0

我认为您仅将向量包含在一个头文件中,但该头文件没有#define 块,这导致重新定义其中包含的向量头文件。请在下面给出的模板中附上您的包含文件并尝试。

 #if !defined(HEADER_FILE) 
 #define HEADER_FILE
 // Your code
 #endif
于 2009-12-29T11:12:20.833 回答
0

由于链接过程中出现问题,它看起来与模板实例化有关。鉴于实例化实现细节,模板函数/定义应放在公共包含文件中,以确保它们在任何地方都可见,并且不会重复标题包含此处可能出现的情况。

从您发布的问题来看,操作员可能会被 std::distance() 使用,它可能会从 find() 类型函数中调用。因此,请查看您是否定义或调用了此类函数,因为它们可能与向量和字符串一起使用,并确保它们位于共享头文件中。

于 2009-12-29T13:35:50.883 回答