c++ - 类的前向声明作为模板参数。为什么这行得通?

标签 c++

我一直在研究一些 C++ 模板元编程,我发现了一些我认为很奇怪的情况。 假设我有以下类(class)。

template<typename T>
class Foo{
};

然后我发现我使用一个类的前向声明(我假设这就是它被视为的)作为模板参数

Foo<class bar> bar1;

我还发现下面的代码也可以正常编译。

Foo<class bar()> bar2;
Foo<class bar(int a)> bar3;

所以我的问题是,为什么这样做有效。这三种情况是怎么回事。
根据标准,我现在不能声明一个类,所以失败了:

Foo<class bar{}> bar4

我最初的假设是这只是一个前向声明,您实际上可以在该指针处声明一个类(我可以看到它的可能用途)。 但是,你不能。那么我的第二个问题是上面的用途是什么?它是否有任何实际用途,或者只是 c++ 工作方式的结果,这是合法的。我可以看到的一个用途是您可以使用它来创建类型的标记信息。

我正在使用最新版本的 g++

最佳答案

在所有 3 种情况下,您都向前声明类 bar,因此您必须稍后定义它。


Foo<class bar> bar1;

这是有效的,因为它允许在模板参数中第一次声明一个类,即它等同于

class bar;
Foo<bar> bar1;

Foo<class bar()> bar2;

这将创建类 bar,就像以前一样,并创建一个不带参数并返回 bar 的函数。


Foo<class bar(int a)> bar3;

这与第二个非常相似,只是在这里,它声明了一个接受 int 的函数,而不是没有。相当于

class bar;
Foo<bar(int)> bar3;

关于c++ - 类的前向声明作为模板参数。为什么这行得通?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39279149/

相关文章:

c++ - 一个接一个地加载对象时,OpenGL indexbuffer 不工作

c++ - LPD3DXFONT 不绘制

c++ - 在boost中为动态数组定义自定义步进器

c++ - vector<string> 可以容纳多少数据?

c++ - 像 unsigned int 一样转换类型转换的有符号 int

c++ - Bison 上下文中使用的 C++ 中的 union

c++ - 获取显示器所插入的视频适配器

c++ - FOO::BAR 类命名空间的 Qt MOC 错误

c++ - CUDA C - 无法编译在头文件中声明并在 .cu 中实现的类

c++ - 尝试从 VC++ 使用 matlab 引擎时出错