【发布时间】:2018-05-23 00:36:15
【问题描述】:
当我从一个类继承时,编译器必须知道基类的定义才能创建它。但是当我使用自己(继承类)从模板类继承时,编译器如何创建代码?它还不知道类的大小。
#include <iostream>
template <class T> class IFoo
{
public:
virtual T addX(T foo, double val) = 0;
// T memberVar; // uncomment for error
};
class Foo : public IFoo<Foo>
{
public:
Foo(double value)
: m_value(value) {}
Foo addX(Foo foo, double b) override
{
return Foo(foo.m_value + b);
}
double m_value;
};
int main()
{
Foo foo1(1);
Foo foo2 = foo1.addX(foo1, 1);
std::cout << foo2.m_value;
}
首先我认为它有效,因为它是一个接口,但它也适用于常规类。
当我将模板存储为成员时,我收到一个错误,即 Foo 未定义,正如我预期的那样。
【问题讨论】:
-
memberVar将使Foo(间接地)持有另一个自身的实例。从本质上讲,这将使sizeof(Foo) == 2 * sizeof(Foo)。所以当然行不通。 :-) -
感谢您的所有精彩回答。现在我很清楚了。
标签: c++ templates inheritance interface