模板函数特化的通常定义是这样的:
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/