我有使用gcc编译的下一个示例代码(使用-std = c++ 11的4.7.2):
template<class C>
struct template_test
{
C testing() const
{
return C();
}
};
class A;
struct test : public template_test<A> // (1)
{};
struct A
{};
int main()
{
test t;
}
在点(1),实例化
template_test<A>::testing()
函数,并使用A
函数,特别是其默认构造函数。因此,test
将此实例化函数包含为函数成员。但是,此时A
是不完整的类型,C++禁止您使用不完整类型的成员。这是
positive
gcc的错误,还是有其他解释? 最佳答案
template_test::testing()不仅未在(1)处实例化,而且从未在此程序中实例化。模板成员仅在使用时实例化,并且不使用testing()。为了更清楚一点,将代码稍微更改为:
template<class C>
struct template_test
{
C testing() const
{
return C::foo();
}
};
class A;
struct test : public template_test<A> // (1)
{};
struct A
{};
int main()
{
test t;
}
也可以编译并正常运行。
关于c++ - 此代码必须有效吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14820358/