提问人:Vittorio Romeo 提问时间:3/17/2023 更新时间:3/17/2023 访问量:149
显式实例化定义:类模板的构造函数模板——可能吗?(Clang 与 GCC)
Explicit instantiation definition: constructor template of class template -- is it possible? (Clang versus GCC)
问:
请考虑以下类模板:
template <typename>
struct S
{
template <typename T>
void f(T) { /* ... */ }
};
可以提供自身和以下两者的显式实例化定义(或声明):extern template
S
S::f
template struct S<int>;
template void S<int>::f<int>(int);
但是,如果我们与构造函数模板完全相同的情况,而不是常规成员函数模板呢?
template <typename>
struct S
{
template <typename T>
S(T) { /* ... */ }
};
根据 Clang 的说法,仍然可以为自己提供一个显式的实例化定义,但不能为构造函数提供:S
template struct S<int>; // OK
template S<int>::S<int>(int); // ERROR (!)
error: out-of-line constructor for 'S' cannot have template arguments template S<int>::S<int>(int); ^~~~~~
另一方面,海湾合作委员会似乎接受这两种定义。在 godbolt.org 上查看此实时示例。
模板 S<int>::S<int>(int)
等定义是否合法,或者 Clang 拒绝它是否正确?
答: 暂无答案
评论
S<int>::S(int)
enable_if