模板的构造函数的显式实例化模板类(Explicit instantiation of templat

2019-07-20 10:15发布

我不确定它是否在Clang的3.2错误或违反C ++ 03,但现在看来,对于模板类模板的构造函数的显式实例失败,但模板类的模板成员函数显式实例成功。

例如,下面的编译没有既铛++和g ++一个问题:

template<typename T>
class Foo
{
public:
    template<typename S>
    void Bar( const Foo<S>& foo )
    { }
};
template class Foo<int>;
template class Foo<float>;

template void Foo<int>::Bar( const Foo<int>& foo );
template void Foo<int>::Bar( const Foo<float>& foo );
template void Foo<float>::Bar( const Foo<int>& foo );
template void Foo<float>::Bar( const Foo<float>& foo );

而没有与G ++警告以下编译但失败铛++:

template<typename T>
class Foo
{
public:
    template<typename S>
    Foo( const Foo<S>& foo )
    { }
};
template class Foo<int>;
template class Foo<float>;

template Foo<int>::Foo( const Foo<int>& foo );
template Foo<int>::Foo( const Foo<float>& foo );
template Foo<float>::Foo( const Foo<int>& foo );
template Foo<float>::Foo( const Foo<float>& foo );

特别是,我看到了形式的两个错误消息:

TemplateMember.cpp:12:20: error: explicit instantiation refers to member
      function 'Foo<int>::Foo' that is not an instantiation
template Foo<int>::Foo( const Foo<int>& foo );
                   ^
TemplateMember.cpp:9:16: note: explicit instantiation refers here
template class Foo<int>;
               ^

这是违反标准或铛++中的错误吗?

Answer 1:

它看起来像你发现了一个GCC的bug。 这些都命名隐式声明的拷贝构造函数:

template Foo<int>::Foo( const Foo<int>& foo );
template Foo<float>::Foo( const Foo<float>& foo );

每[temp.explicit] P4,

如果显式实例名隐式声明的特殊成员函数(第12章)的声明,是形成不良的程序。

因此锵是正确的拒绝这个代码。



文章来源: Explicit instantiation of templated constructor for template class