gpt4 book ai didi

c++ - 如何理解语法 TB> 以及这段代码如何避免无限递归?

转载 作者:太空狗 更新时间:2023-10-29 20:08:29 26 4
gpt4 key购买 nike

我有一个示例代码如下:

#include <iostream>
template<class T1>
class B {
public:
B() : t1_(*this) {}
void Test() {
t1_.Test();
}
void Print() const {
std::cout << "test\n";
}
private:
T1 t1_;
};

template<template<class> class TB>
class A1 {
public:
explicit A1(const TB<A1<TB>> &b) : b_(b) {}
void Test() {
b_.Print();
}
private:
const TB<A1<TB>> &b_;
};

int main() {
B<A1<B>> bt;
bt.Test();
}

这是对这个 answer 的洞察,此代码确保类 B有成员(member)A1A1引用了 B .

虽然这段代码有效,但我真的不知道它是如何工作的,尤其是代码const TB<A1<TB>> &b_; .自 TB是模板模板参数,TB<...>TB 的特化, 哪个参数是A1<TB> , 正确的?那么第二个TB是什么意思?在 TB<A1<TB>>意思?如果第二个TB是模板,为什么没有参数?

正如 Matthieu Brucher 所说,这段代码确实是用来避免无限递归的。由于我不完全理解这段代码是如何工作的,任何人都可以解释编译器如何使这段代码工作吗?或者,这段代码在编译后应该是什么样子?

最佳答案

由于 A1 声明,第二个 TB 没有参数:

template<template<class> class TB>
class A1;

这表示 A1 采用一个模板参数,而参数本身采用一个未指定的模板参数。 A1 将随心所欲地使用此模板参数,但在声明 A1 时不得给出它,这打破了没有此功能会出现的无限递归。

例如,你可以这样写:

A1<TB> foo;

你也可以这样写:

A1<std::vector> foo(std::vector<A1<std::vector>>()); // UB because of b storage, but it's the example

关于c++ - 如何理解语法 TB<A1<TB>> 以及这段代码如何避免无限递归?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53776843/

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