【问题标题】:Having trouble overriding a virtual method declared with template parameter pack expansion覆盖使用模板参数包扩展声明的虚拟方法时遇到问题
【发布时间】:2016-06-20 07:38:57
【问题描述】:

我在覆盖使用模板参数包扩展指定的基类的虚拟方法时遇到问题 - 而覆盖方法将显示实际的相关类型。这是一个 MCVE:

#include <iostream>
template <typename... Ts>
class A { virtual void foo(Ts&&...); };

class B : public A<int, unsigned> {
    void foo(int x, unsigned y) override { std::cout << "here"; }
};

int main() {
    B b;
}

编译这个(标准设置为 C++11 或 C++14),我得到:

a.cpp:9:7: error: ‘void B::foo(int, unsigned int)’ marked override, but does not override
  void foo(int x, unsigned y) override {
       ^

【问题讨论】:

  • 仔细查看基类函数的签名。

标签: c++ c++11 variadic-templates virtual-functions variadic-functions


【解决方案1】:

基类的函数签名是void foo(Ts&amp;&amp;...);

派生类的函数签名是void foo(int x, unsigned y)

看到两者之间有什么不同吗?区别是&amp;&amp;。为了匹配基类的函数签名,需要派生类使用void foo(int&amp;&amp; x, unsigned&amp;&amp; y)

Demo:

#include <iostream>

template <typename... Ts>
struct A { virtual void foo(Ts&&...) {} };

struct B : A<int, unsigned> {
    void foo(int&& x, unsigned&& y) override { std::cout << "here"; }
};

int main() {
    B b;
    b.foo(1, 2u);
}

【讨论】:

  • 您使用的是什么版本的 clang,您的代码在 3.7 上运行良好:coliru.stacked-crooked.com/a/5695318de3b879c9 对于您的示例,我认为您犯了一个常见错误,模板 T&& 是一个通用参考,但前提是模板参数与模板函数直接相关。在这里,Ts&&... 只匹配右值引用。
  • 当然不链接,A::foo();的定义在哪里?
猜你喜欢
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 2012-11-28
  • 1970-01-01
  • 2014-11-21
  • 2011-03-01
  • 1970-01-01
  • 2019-10-16
相关资源
最近更新 更多