类模板特化处的前向声明

3
以下是在类模板特化阶段的前向声明,是否为合法的C++代码?
template<typename>
struct Basic
{};

template<>
struct Basic<struct Foo> //<-- Fwd declaration?
{};

struct Foo
{
    Basic<Foo> m_a;
};

int main()
{
    Foo test;
}

这段代码可以编译,但我不确定是否合法。


你尝试编译了吗?编译器接受了它吗? - R Sahu
作为这种技术在实际代码中使用的示例,请参见Spirit X3。文档的这一部分展示了它的应用(使用x3::rule<class employee, ...>)。 - Justin
1
@ConstantinosGlynos,我认为这是您应该添加到帖子中的附加信息。 - R Sahu
@Justin 有趣的是,在你发来的文档中,它被用作模板参数,而不是函数参数。没想到这也可以。 - Constantinos Glynos
@DeiDei 很酷。你从哪里得到的?能分享一个链接吗? - Constantinos Glynos
显示剩余2条评论
2个回答

7
template<>
struct Basic<struct Foo>
{};

合法。

根据C++11标准(链接)

类声明将类名引入到声明它的作用域中,并隐藏了该名称在封闭作用域中的任何类、变量、函数或其他声明。


@R Sahu 谢谢!这就是我在寻找的!如果标准这么说,那对我来说已经足够好了。 - Constantinos Glynos

4

是的,这是合法的C++代码并且它进行了结构体Foo的前置声明。

你也可以在函数声明中这样做:

void fun(struct foo);

struct foo {};

void fun(struct foo) {}

或者使用指针。
struct foo* pointer;
struct foo {};

基本上,在任何不需要完整类型的地方都可以使用它(也适用于 class)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接