【发布时间】:2014-06-07 05:29:44
【问题描述】:
我有一个非常简单的多态设置:带有虚方法的基类,重载方法的派生类。稍有不同的是,它们是模板类,而基类的方法会导致派生类的编译失败。由于基类的方法被重载,我认为这不会是一个问题,但显然这是一个问题。
为了说明问题,我已尽可能地精简代码。在这里。
DspBuffer.h
#include <vector>
#include <algorithm>
#include <cassert>
template <class T>
class DspBuffer {
public:
std::vector<T> buf;
DspBuffer<T>(unsigned size) {buf = std::vector<T>(size);}
virtual void sort() {std::sort(buf.begin(), buf.end());}
};
ComplexDspBuffer.h
#include <complex>
#include "DspBuffer.h"
template <class T>
class ComplexDspBuffer : public DspBuffer<T> {
public:
ComplexDspBuffer<T>(unsigned size) : DspBuffer<T>(size) {}
void sort() {assert(false);}
};
main.cpp
#include "ComplexDspBuffer.h"
int main(int argc, char **argv) {
ComplexDspBuffer< std::complex<double> > buf(1);
return 0;
}
在我看来,这不应该是构建的问题,但编译器(Xcode 5.0.2)会产生如下错误 - “/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain /usr/lib/c++/v1/algorithm:644:97:二进制表达式的操作数无效('const std::__1::complex' 和 'const std::__1::complex')”。
它指的是 std::sort 使用的模板化 __less 函数。换句话说,就是构建 DspBuffer.sort() 方法,即使它不能被调用,或者至少不能被调用。我做错了什么,还是有一个不能与派生类的数据类型一起使用的基类方法?
【问题讨论】:
-
#include <algorithm>在哪里? -
@PaulMcKenzie 很好。我编辑了我的代码和问题,但错误是一样的。
-
将 void sort() = delete;是更好的继承选择?我现在明白基类被称为。嗯..
-
实例化基类时可能需要 std::conditional 吗?
标签: c++ xcode templates polymorphism