类模板专业化的前向声明

Con*_*nos 2 c++ templates

下面的前向声明,在类模板特化阶段,是合法的 C++ 代码吗?

template<typename>
struct Basic
{};

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

struct Foo
{
    Basic<Foo> m_a;
};

int main()
{
    Foo test;
}
Run Code Online (Sandbox Code Playgroud)

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

R S*_*ahu 5

template<>
struct Basic<struct Foo>
{};
Run Code Online (Sandbox Code Playgroud)

是合法的。

C++11 标准

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