繁体   English   中英

在模板类中定义模板化的友元函数

[英]Defining a templated friend function inside a template class

为什么以下代码产生编译器错误没有名为make_static_vector模板

template<class Tuple>
class vector;

template<typename T, std::size_t N>
using static_vector = vector<std::array<T, N>>;

template<class Tuple>
class vector
{
private:
    using value_type = std::decay_t<decltype(std::declval<Tuple&>().operator[](0))>;

    template<typename T, typename... Elements>
    friend static_vector<T, sizeof...(Elements)> make_static_vector(Elements&&... elements) {
        return { std::forward<Elements>(elements)... };
    }

    template<typename... Elements>
    vector(Elements&&... elements)
        : m_elements{ static_cast<value_type>(std::forward<Elements>(elements))... }
    { }

    Tuple m_elements;
};

int main()
{
    make_static_vector<double>(1, 1);   
    return 0;
}

我已经创建了代码现场演示 当我在类外部移动make_static_vector的定义并且只在类中留下声明部分时,它正在工作。

为什么不能直接在类中定义函数?

声明模板函数的唯一地方是在类中; 它在封闭命名空间中不是“可见的”,因此不能用于正常查找,仅用于参数依赖查找。

您需要在类外面声明(并定义)它以查找要找到的函数,并将其声明为友元函数(如您所述)。

来自cppreference

在类或类模板X中的友元声明中首先声明的名称成为X的最内层封闭命名空间的成员,但是无法进行查找(除了与X相关的依赖于参数的查找),除非命名空间范围内的匹配声明是提供...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM