c++ - 为另一种模板类型声明模板特化的正确方法是什么?

标签 c++ templates

模板函数特化的通常定义是这样的:

class Foo {
    [...]
};

namespace std {
    template<>
    void swap(Foo& left, Foo& right) {
        [...]
    }
} // namespace std

但是当专门化的类型本身就是模板时,您如何正确定义专门化?这是我得到的:

template <size_t Bits>
class fixed {
    [...]
};

namespace std {
    template<size_t Bits>
    void swap(fixed<Bits>& left, fixed<Bits>& right) {
        [...]
    }
} // namespace std

这是声明 swap 的正确方法吗?它应该是模板函数 std::swap 的特化,但我无法判断编译器是否这样看待它,或者它是否认为它是它的重载或其他东西。

最佳答案

您的解决方案不是模板特化,而是 std 命名空间中函数的重载,根据 c++ 标准,这是“未定义的行为”。

This question正是你的问题。

Scott Meyers 在 Effective C++ 中对此进行了讨论,并且在 usenet's comp.lang.c++ 上有一个后续线程.

  • 他建议你在fixed自己的命名空间中定义它。
  • 确保“fixed”在命名空间中。
  • 不要在调用前加上“std::”。
  • Koenig (a.k.a. argument dependent) lookup找到正确的交换功能。

如果您在尝试在命名空间 std 中定义它时看到编译错误,这可能是由于您不幸选择了类名 :) 当在 namespace std 中时,“fixed”被视为 std::fixed,浮点精度运算符。

关于c++ - 为另一种模板类型声明模板特化的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2726408/

相关文章:

c++ - 如何从具有 char 的二维 vector 的类转换为另一个具有 char 变量的 obj 的二维 vector ?

c++ - 将非模板函数指针传递给模板方法

java - 是否有可能 - 模板化此方法?

c++ - error : expected constructor, 析构函数,或者静态模板中 ‘'之前的类型转换

c++ - 存在重载命名空间函数时需要 std::qualifier 吗?

c++ - 用于跨线程分配和免费的良好分配器

templates - 需要对 Azure Pipeline 模板 yaml 中的每个循环使用 For 循环而不是

templates - Dreamweaver 嵌套模板

c++ - 推断/删除模板模板参数的类型

c++ - vmware中出现 "the application has failed to start because its side-by-side configuration is incorrect"错误如何处理?