对静态成员使用"template<>"

Use of "template<>" for static members

本文关键字:静态成员 gt lt template      更新时间:2023-10-16

我遇到了一些让我感到困惑的代码。我已经将困惑提炼为一个简单的案例

template<typename T>
struct S
{
    T member;
    static const size_t size;
};
struct U { int i; };
typedef S<U> US_t;
template<> const size_t US_t::size = sizeof(U);

Q1:既然US_t已经完全描述,为什么我需要在最后一行加上"template<>"?

我实际遇到的代码 - 编译 - 相当于以下内容:

template<>template<> const size_t US_t::size = sizeof(U);

我很确定这是一个剪切和粘贴错误,因为它被编译了,所以没有被捕获。Q2: 这有效吗?如果是这样,为什么?[我注意到 codepad.org 将使用" template<>template<>"编译代码。

将您的 typedef 想象为在编译时而不是预处理器时扩展的宏。

然后没有template<>你会有

const size_t S<U>::size = sizeof(U);

这不是一个有效的语法,因为你正在做一个模板专用化。