我有使用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/

10-12 03:42
查看更多