请参阅以下代码:
namespace std {
template <std::size_t I, class T>
auto& get(my_tuple_like_type<T>& t)
{
std::size_t ext = t.template extent<I>(); // This line
// .... do something with ext and return
}
}
正如您所看到的,我正在尝试专门化(重载)std::get
以使我自己的类模板my_tuple_like_type
有些std::tuple
- 就像。
但是gcc 5.4.0抱怨常量I
不是类型名称。似乎原因是已经有一个名为std::extent
的类模板。
我能想到的一种解决方法是将调用转发给在namespace std
之外声明的独立实现函数。但我想知道,根据标准这是正确的行为吗?或者它只是gcc的另一个错误?
我想这应该是一个bug,因为clang和MSVC都编译上面的代码就好了。另一方面,Nvidia的CUDA编译器(nvcc)会产生类似的错误消息。
谢谢。
修改
禁止在namespace std
内提供重载(Should you overload swap in the std namespace?),所以我做错了。
但我无法看到这可能导致的潜在问题。是否有任何理由禁止用户定义类型的过载?