调用具有现有名称的模板成员函数

时间:2017-04-26 10:03:37

标签: c++ templates name-lookup

请参阅以下代码:

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?),所以我做错了。

但我无法看到这可能导致的潜在问题。是否有任何理由禁止用户定义类型的过载?

0 个答案:

没有答案