gpt4 book ai didi

c++ - 使用继承类从模板类继承

转载 作者:行者123 更新时间:2023-11-30 01:05:56 26 4
gpt4 key购买 nike

当我从一个类继承时,编译器必须知道基类的定义才能创建它。但是当我使用自己(继承类)从模板类继承时,编译器如何创建代码?它还不知道类的大小。

#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;
}

首先我认为它有效,因为它是一个接口(interface),但它也适用于常规类。

当我将模板存储为成员时,我得到一个错误,指出 Foo 未定义,正如我预期的那样。

最佳答案

这里的一般概念称为好奇重复模板模式CRTP。搜索它会得到很多点击。参见:https://stackoverflow.com/questions/tagged/crtp .

然而,有一个简单的解释可能会回答您的问题,而无需深入了解 CRTP。 C 和 C++ 中允许以下内容:

struct foo {
struct foo *next;
...
};

或者有两种类型:

struct foo;
struct bar;

struct foo {
struct bar *first;
...
};

struct bar {
struct foo *second;
...
};

只要只使用指向structclass 的指针,就不必提供类型的完整定义。人们可以通过多种方式在其之上分层模板,并且必须清楚地分别推理参数化模板的类型及其在模板中的使用。添加 SFINAE(替换失败不是错误),甚至可以制作不会实例化的模板,因为无法使用给定类型完成操作。

关于c++ - 使用继承类从模板类继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47719876/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com