对 c++ (g++) 中具有菱形继承的函数的未定义引用
Undefined reference to function in c++ (g++) with diamond inheritance
我简化了我的原始问题以突出问题,因此某些灯具可能看起来是多余的,但它们对我项目的其余部分很有用。
此示例的代码位于单个文件中t.cc
并使用g++ t.cc
进行编译,但错误如下:
In function `DataOp<int>::value()':
t.cc:(.text._ZN6DataOpIiE5valueEv[_ZN6DataOpIiE5valueEv]+0x28): undefined reference to `Data<int>::data() const'
collect2: error: ld returned 1 exit status
代码是这样的:
template<typename T> struct Data {
virtual int data() const = 0;
};
template<typename T> struct DataImpl: virtual Data<T> {
virtual int data() const override { return 0; }
};
template<typename T> struct DataOp: virtual Data<T> {
virtual T value() { return Data<T>::data(); }
};
struct OpImpl
: DataOp<int>
, DataImpl<int>
{};
int main() {
OpImpl c;
return 0;
}
有趣的是,在实现中删除virtual
DataOp
消除了链接器问题(但我在项目中无法轻松做到这一点)。
更新
- 链接以重现结果。 当
- 优化被禁用时,例如,当 -O0(或没有优化标志)提供给 g++ 时,就会出现问题。
- 似乎也可以在 clang++ 上重现
- 按此处删除模板可消除错误。
找到了一个解决方案并将其发布在这里以供将来参考。在DataOp
中添加this
可以解决问题:
template<typename T> struct DataOp: virtual Data<T> {
virtual T value() { return this->data(); }
};
相关文章:
- 继承函数的重载解析
- 如何使用 C++ 中的继承函数访问派生类中的局部变量
- 派生类调用使用非继承成员的继承函数
- 继承函数是否适用于 C++ 中的基类元素或派生类元素?
- 在链表中的某个点插入时出现问题,C++中的继承函数
- std :: is_same-来自integral_constant的继承函数的用例
- 如何将同名的继承函数视为重载函数
- 使用子函数的继承函数
- 执行覆盖的继承函数
- 相对于更专业的继承函数,模板更喜欢子类函数
- C++:继承函数并重新定义它们
- C++ 继承函数指针,可与派生方法一起使用
- 不同对象的向量,对象具有非继承函数
- C++多级继承函数调用
- 基类指向派生类继承函数调用的指针
- C++继承函数覆盖
- 派生类是否C++必须在头文件中包含继承函数/成员的定义
- 继承函数中的参数消失
- C++通过继承函数实现继承的抽象函数
- 构造函数和继承函数 c++