0xb*_*00d 3 c++ templates friend c++14 c++17
为什么以下代码会产生编译器错误而没有命名模板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;
}
Run Code Online (Sandbox Code Playgroud)
我已经创建了代码的现场演示.当我移动make_static_vector
类外部的定义并且只在类中留下声明部分时,它正在工作.
为什么不能直接在类中定义函数?
声明模板函数的唯一地方是在类中; 它在封闭的命名空间中不是"可见的",因此不能用于正常查找,仅用于参数依赖查找.
您需要在类外面声明(并定义)它以查找要找到的函数,并将其声明为友元函数(如您所述).
在类或类模板X中的友元声明中首先声明的名称成为X的最内层封闭命名空间的成员,但是无法进行查找(除了依赖于参数的查找X),除非命名空间范围内的匹配声明是提供...
归档时间: |
|
查看次数: |
219 次 |
最近记录: |