Forward Declaration at Class Template 专项化

forward declaration at class template specialisation

提问人:Constantinos Glynos 提问时间:1/23/2018 最后编辑:JustinConstantinos Glynos 更新时间:1/23/2018 访问量:1727

问:

在类模板专用化阶段,以下正向声明是否是合法的 C++ 代码?

template<typename>
struct Basic
{};

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

struct Foo
{
    Basic<Foo> m_a;
};

int main()
{
    Foo test;
}

它确实可以编译,但我不确定它是否合法

C++ 模板

评论

0赞 R Sahu 1/23/2018
你试过编译它吗?编译器接受它了吗?
0赞 Justin 1/23/2018
作为在实际代码中使用它的示例,请参阅 Spirit X3。文档的这一部分做到了这一点(使用x3::rule<class employee, ...>)
0赞 Constantinos Glynos 1/23/2018
@R Sahu 我当然知道了。如果不先尝试,我不会发布这样的问题。问题是它是否合法,而不是它是否有效。代码如下:rextester.com/NLJS2787
0赞 DeiDei 1/23/2018
是的,它是合法的 C++,它不是唯一可以这样做的地方。
1赞 R Sahu 1/23/2018
@ConstantinosGlynos,这是我认为您应该将其添加到帖子中的附加信息。

答:

4赞 DeiDei 1/23/2018 #1

是的,它是合法的 C++,并且它确实向前声明。struct Foo

您也可以在函数声明中执行此操作:

void fun(struct foo);

struct foo {};

void fun(struct foo) {}

或带有指针。

struct foo* pointer;
struct foo {};

基本上任何不需要完整类型的地方。(也适用于。class

7赞 R Sahu 1/23/2018 #2
template<>
struct Basic<struct Foo>
{};

是合法的。

C++11 标准

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

评论

0赞 Constantinos Glynos 1/23/2018
@R Sahu 谢谢!这就是我一直在寻找的!如果标准是这样说的,那对我来说已经足够了。