Rob*_*iac 6 c++ loops inline c++11
我这里有这段代码.
#include <iostream>
using namespace std;
template <typename T> inline T bigArry(const T data[5])
{
T level = data[0];
for(T item : data) // error C2143: syntax error : missing ',' before ':' (1st)
{ //error C2143: syntax error : missing ';' before '{' (3rd)
if(level<item){ level=item; }
}
return level;
}
int main()
{
int data[5]={//five variables}
cout << bigArry(data);//see reference to function template instantiation 'T bigArry<int>(const T [])' being compiled with [ T=int] (2nd)
return 0;
}
Run Code Online (Sandbox Code Playgroud)
函数bigArry()从5个元素的数组中返回最高值.
问题是,当我使用基于范围的循环时,它会给我代码中提到的错误.但是当我使用通常的时候,一切都恢复正常.我的意思是,对我的语法看起来很好,我看不出问题.我正在使用Visual Studio 2010.
我想问的另一件事是关于内联函数.目前我正在阅读C++ Primer Plus第6版.我何时知道某个函数何时太大而无法内联?是否有一个标准,代码应该有多短?或者,当我们"认为"它没关系时,我们是否使用内联函数?
该参数data不是函数模板中的数组.它实际上是一个指针.
这个功能
template <typename T> inline T bigArry(const T data[5])
Run Code Online (Sandbox Code Playgroud)
是正是因为这个相同的:
template <typename T> inline T bigArry(const T *data)
Run Code Online (Sandbox Code Playgroud)
完全没有区别.
这就是你的代码给出编译错误的原因.
这里有几个修复:
您可以通过引用接受参数,如:
template <typename T>
inline T bigArry(const T (&data)[5]) //NOTE &
Run Code Online (Sandbox Code Playgroud)
这应该工作.但那看起来很麻烦.也许,使用下一个.
或者你可以使用它(由@yzt建议):
template <typename C>
inline auto bigArry(C const & data) -> decltype(data[0])
Run Code Online (Sandbox Code Playgroud)
这比上面的(以及下面的)更干净,也更灵活.除了传递数组之外,只要定义良好并且意味着它意味着什么,你就可以传递任何容器data[0].
或者如果您愿意,您可以使用std::array<T, 5>:
template <typename T>
inline T bigArry(const std::array<T,5> & data)
Run Code Online (Sandbox Code Playgroud)希望有所帮助.
这是因为当用作函数参数或作为函数参数传递时,数组类型会衰减为指针.换句话说,您的函数签名相当于:
template <typename T> inline T bigArry(const T* data)
Run Code Online (Sandbox Code Playgroud)
基于范围的for循环传递data给全局std::begin()和std::end()函数,以便(分别)获得容器的第一个和最后一个元素的迭代器.
当然,没有接受指针的全局函数std::begin()和std::end()函数,它们也无法有意义地定义:如何只给出指向第一个元素的指针来确定容器的结尾?
您可以使用std::array而不是C数组(std::array是C数组周围的零开销包装器),并相应地修改您的调用函数:
template <typename T> inline T bigArry(std::array<T, 5> data)
// ^^^^^^^^^^^^^^^^
{
T level = data[0];
for(T item : data)
{
if(level<item){ level=item; }
}
return level;
}
int main()
{
std::array<int, 5> data = {1,2,3,4,5};
// ^^^^^^^^^^^^^^^^^^^^^^^
std::cout << bigArry(data);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是一个实例.