为什么X <t>不起作用,但新的X <t>适用于转发的声明类模板?

时间:2016-08-12 21:38:50

标签: c++ templates c++11 g++

在撰写When can I use a forward declaration?的答案时,我遇到了一个我无法解释的问题。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Action": [
                "sns:Publish"
            ],
            "Resource": "arn:aws:sns:*:*:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "sns:Publish"
            ],
            "Resource": "*"
        }
    ]
}

当我使用g ++ 4.9.3编译上述程序时,我得到

的编译器错误
// Forward declared class template:
template <typename T> struct X;

// Two other class templates that use it

template <typename T>
struct Foo {
   X<T>* m;
   Foo() : m(new X<T>) {}
};

template <typename T>
struct Bar {
   X<T> m;
};

// and a function that creates instances of Foo and Bar.

void test1()
{
   Foo<int> foo;
   Bar<int> bar;
}

// Define the class template after test1. On purpose.
template <typename T> struct X {};

int main()
{
}

但不适用于

Bar<int> bar;

两者都需要Foo<int> foo; 的定义,因为如果省略X的定义,两者都无法编译。

但是,只需在翻译单元中加入X的定义,X就可以正常工作,Foo<int> foo;不起作用。这是预期的吗?

0 个答案:

没有答案