【问题标题】:Virtual method template in Class template C++ [duplicate]类模板C ++中的虚拟方法模板[重复]
【发布时间】:2016-04-12 19:30:00
【问题描述】:

我的学习问题遇到了小问题。

    template<typename T> 
    class AlgorytmSortujacy 
       { 
       public: 
          template <typename F> 
          virtual std::vector<T> sortuj(std::vector<T>  w, F porownywacz) const = 0;
       }; 

此代码必须是排序算法的接口。当我例如实现冒泡排序,我必须从这个类派生并实现sortuj函数。

问题是VS2013不接受那些形式的代码,我的意思是模板虚函数(C2898错误)。你知道有什么解决办法吗?

如您所见,sort 函数从 std::vectorF porownywacz 获取容器 - 它是比较数组的两个元素的函数对象

最后 - 我认为我无法更改此代码,我从老师那里得到了它,我认为我必须让它工作。

【问题讨论】:

  • 你不能有虚拟模板方法,虚拟是运行时工具,而模板是编译时
  • 你的老师给你的代码有虚函数模板?如果我是你,我会联系他们并要求澄清。

标签: c++ templates virtual stdvector


【解决方案1】:

问题出在F porownywacz,不能是纯虚函数的模板。

Virtual member functions can't be templates,引用 clang “virtual 不能在成员函数模板上指定”。

来自 cppreference 网站;

成员函数模板不能是虚拟的,派生类中的成员函数模板不能覆盖基类中的虚拟成员函数。

这里的区别本质上归因于virtual 函数是“运行时的东西”,它们在运行时被解析。模板类型需要在编译时解析。

你在课堂上使用的是符合标准的编译器吗,老师用的是什么?我会就这个问题与您的老师联系,引用编译器错误并检查您是否与您的同学在同一页面上,并与他们讨论他们遇到的错误。


This Q&A 包含更多细节和一些您可能感兴趣的替代方案。

【讨论】:

  • 我们使用任何我们想要的编译器,例如。我使用 VS 2013。所以此刻我不知道该怎么办,我不知道谁是愚蠢的 :)
  • 老师用的是什么编译器?听起来您需要按原样更改代码并寻找替代方法。我会先问老师代码中的错误 - 这可能是他们还没有注意到的小错误。
  • 好的,谢谢大家的解释;)
猜你喜欢
  • 2016-09-28
  • 2011-12-19
  • 2014-10-25
  • 2012-11-28
  • 2021-06-16
  • 1970-01-01
  • 1970-01-01
  • 2019-09-06
相关资源
最近更新 更多