【发布时间】:2018-09-26 11:34:07
【问题描述】:
我有一个使用模板的基类,它有一些不依赖于模板类型的方法,但是当我使用指针 Base* a 而不是派生类时,编译器会抱怨,因为没有指定类型.我知道在 java 中这是可能的,但不确定在 C++ 中是否可能。这里举个简单的例子:
template <typename T>
class Base {
public:
Base(const T& t) : _t(t) {}
virtual ~Base() { }
void doSomething() { std::cout << "Hello world/n"; }
virtual T getVal() const { return _t; }
private:
T _t;
};
class DerivedA : public virtual Base<std::string>
{
public:
DerivedA(const std::string& path) : Base<std::string>(path) {}
virtual ~DerivedA() {}
};
class DerivedB : public virtual Base<int>
{
public:
DerivedB(int value) : Base<int>(value) {}
virtual ~DerivedB() {}
};
int main(int argc, const char * argv[]) {
DerivedA d("hello world\n");
Base* basePtr = &d; // ERROR: Use of class template 'Base' requires template arguments
basePtr->doSomething();
提前致谢
【问题讨论】:
-
如果你的函数不依赖于签名中的任何模板参数,比如
doSomething函数,那么你可以创建一个非模板“真实”基类,模板化@987654324 @类继承自。 -
你不能这样做。
Base<std::string>和Base<int>是不同的专业,因此它们是不同的类型。你不能把苹果扔进车里…… -
不要将 java 泛型与 c++ 模板混淆,这是两个截然不同的概念
-
使用具体(非模板)基类的建议通常是正确的,但值得检查 - 为什么你想要一个基类指针?你用它做什么?