【发布时间】:2020-02-11 12:18:01
【问题描述】:
我想从article 实现通用reverse 函数,它适用于右值。但没有左值。
#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};
|
您能告诉我正确解决方案的方向吗?
【问题讨论】:
-
构造函数中的
T&&不是转发引用,而是对T的右值引用,这是类中的固定类型。您必须对构造函数本身进行模板化。 -
@n314159 谢谢,我忘了模板调用函数。
标签: c++ templates forwarding-reference