gpt4 book ai didi

c++ - 错误: conflicting declaration using universal references

转载 作者:行者123 更新时间:2023-12-02 03:17:47 31 4
gpt4 key购买 nike

我想实现 article 中的通用反向功能它适用于右值。但不适用于左值。

#include <iostream>
#include <vector>
#include <functional>

template <typename T>
class Reverse
{
T iterable_;
public:
explicit Reverse(T&& iterable) : iterable_(std::forward<T>(iterable)){}

auto begin() { return std::rbegin(iterable_); }
auto end() { return std::rend(iterable_); }
};

std::vector<int> CreateVector()
{
return {0,1,2,3,4,5,6,7,8,9};
}

int main()
{
std::vector<int> v{1,2,3,4,5,6,7}; // line 23

for(const auto& i : Reverse(CreateVector()))
std::cout << i << " ";
std::cout << std::endl;

Reverse(v); // line 29
// for(const auto& i : Reverse(v))
// std::cout << i << " ";

return 0;
}

我收到左值错误:

main.cpp: In function 'int main()':
main.cpp:29:13: error: conflicting declaration 'Reverse<...auto...> v'
29 | Reverse(v);
| ^
main.cpp:23:22: note: previous declaration as 'std::vector<int> v'
23 | std::vector<int> v{1,2,3,4,5,6,7};
|

您能告诉我正确解决方案的方向吗?

最佳答案

首先,您不使用通用/转发引用,只需使用普通的 R 值引用。

您需要语法template<class T> F(T&&) (构造函数必须是模板函数):

template<class F>
explicit Reverse(F&& iterable) : iterable_(std::forward<T>(iterable)){}

如果您使用C++17或更高版本,可以添加推导指南:

template<class T>
Reverse(T&&) -> Reverse<T>;

通过添加上述内容,您不必显式指定 Reverse 的模板参数实例化其对象时的类。如果没有 CTAD,您需要编写:Reverse<decltype(v)>(..)处理 R 值,或 Reverse<decltype((v))>对于 L 值(需要大多数内括号来获取对容器的 L 值引用)。

如果你想创建临时 Reverse服用v作为参数,只需写:

Reverse{v};

(现在对于 Reverse(v),您需要重新声明 v 变量)或命名实例:

Reverse withLvalue(v);

Demo

关于c++ - 错误: conflicting declaration using universal references,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60168623/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com