类模板专业化的前向声明

时间:2018-01-22 18:23:18

标签: c++ templates

以下是在类模板专业化阶段的正式声明,合法的C ++代码吗?

template<typename>
struct Basic
{};

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

struct Foo
{
    Basic<Foo> m_a;
};

int main()
{
    Foo test;
}

does compile,但我不确定这是否合法

2 个答案:

答案 0 :(得分:4)

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

是合法的。

来自C++11 Standard

  

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

答案 1 :(得分:1)

是的,它是合法的C ++,它确实转发声明struct Foo

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

void fun(struct foo);

struct foo {};

void fun(struct foo) {}

或指针。

struct foo* pointer;
struct foo {};

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