在撰写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;
不起作用。这是预期的吗?