【发布时间】:2018-04-18 12:30:42
【问题描述】:
我的 C++ 框架有一个类层次结构。还有一个通用的 Collection 类来处理对象集(比如打印它们)。 这是我的简化类设计:
#include<iostream>
#include<vector>
using namespace std;
class Base {
public:
virtual void print() const {cout << "B" << endl;}
};
class Derived : public Base {
int x;
public:
Derived(int _x) : x(_x) {}
virtual void print() const {cout << "D" << x << endl;}
};
inline void print_elem(const int e) { cout << e << endl; }
inline void print_elem(const Base& e) { e.print(); }
template<class T>
class Collection {
private:
vector<T> elems;
public:
void add(const T& v) { elems.push_back(v); }
void print() {
for (unsigned i=0; i < elems.size(); ++i)
print_elem(elems[i]);
}
};
int main(int argc, const char *argv[]) {
Collection<int> c1;
c1.add(2); c1.add(5);
c1.print();
Collection<Derived> c2;
c2.add(Derived(2)); c2.add(Derived(5));
c2.print();
}
以上代码编译正常。
问题是关于print_elem,因为我必须为每种支持的类型实现。
我想像这样实现它:
inline void print_elem(const Base& e) { e.print(); }
template<class T>
inline void print_elem(const T& e) { cout << e << endl; }
为Base和所有派生类指定实现,所有其他类型应该<<操作符,但是有编译错误说:
模板参数推导/替换失败:
无法将“e”(类型“const Derived”)转换为类型“const unsigned > 字符*'
内联 void print_elem(const T& e) { cout
编译器是否可以将print_elem(const Base& e) 与通用模板一起使用?
【问题讨论】:
-
我认为
template<class T>应该在您调用e.print()的函数之上,而不是在另一个调用cout的函数之上,这就是您收到错误的原因。 -
@PasserBy 我不认为他打算提供
operator <<它有一个print功能我认为模板放错了位置。
标签: c++ templates inheritance