在专业化中使用不完整类型(不在标头中而是在源代码中定义它们)是否有效?以下示例可以编译,但我不确定是否可行
struct A;
namespace fmt{
template<>
struct formatter<A> : formatter<int> {
auto format(A a, format_context& ctx) const;
};
}
struct A {
int x=42;
};
namespace fmt{
auto formatter<A>::format(A a, format_context& ctx) const {
return formatter<int>::format(a.x, ctx);
}
}
是的,这是可能的。
这里有两个单独的问题:
是否可以特化一个不完整的类型?- 当然可以。
(目前尚不清楚如何证明不存在禁令,但有些类型永远无法完整:
void,T[](未指定大小的数组)。对于它们,您还需要进行专门化。)是否可以声明一个带有不完整参数的函数?我在这里不确定,但正在通过实验验证这也是可能的(甚至在模板之外)。