c++ - 函数模板中的非类型参数

标签 c++ arrays templates non-type

我有一个非常简单的模板函数,但是由于非类型参数,我对如何实例化/调用该函数感到困惑。 模板函数的定义如下:

template<typename Glorp, int size>
Glorp min(Glorp array[size])
{

Glorp minival = array[0];
for (int i = 0; i < size; i++)
if (array[i] < minival)
    minival = array[i];

return minival;
}

现在,在 main() 中,我有以下代码:

void main()
{
const int size=5;
int array[size];
for (int i = 0; i < size; i++)
    cin >> array[i];

int p = min(array[size]);
cout << p;
}

这让我收到错误消息:

Error   1   error C2783: 'Glorp min(Glorp *)' : could not deduce template argument for 'size'   c:\users\tamara\documents\visual studio 2013\projects\nuevoprojecto\nuevoprojecto\main.cpp  23  1   NuevoProjecto

如何从 main() 调用这个函数?我找不到这个问题的答案,我看到的唯一例子是模板类中的非类型参数

最佳答案

我看到你的代码有两个主要问题

1) 模板函数接收数组、推导类型和大小的语法如下

template <typename Glorp, int size>
Glorp min (Glorp (&array)[size])
 {
   // ...........^^^^^^^^
 }

2) 你必须在没有[size]

的情况下调用它
int p = min(array[size]); // wrong
int p = min(array);       // correct

因为传递 array[size] 您试图从未分配的内存位置传递单个 int(正确的 array 值是从 array[0]array[size-1]).

一个小问题:main() 返回一个 int,而不是一个 void

题外话建议:如果您至少可以使用 C++11,请尽可能考虑使用 std::array,而不是旧的 C 风格数组。

关于c++ - 函数模板中的非类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51143638/

相关文章:

ios - Swift - 数组过滤器不删除对象

c++ - 在原生 C 代码中使用 Android InputStreams

java - MYSQL JDBC java.sql.SQLException : Operation not allowed after ResultSet closed

c++ - 在 C++ 中(不在 C 中)具有未指定边界的数组指针的可用情况

arrays - 比较两个数组并获取不常见的值

C++ 没有合适的默认构造函数可用 - 继承的模板化构造函数没有参数

c++ - 为什么模板只能在头文件中实现?

c++ - 是否有良好/广泛采用的 c++ 模板编码约定/标准?

c++ - Emacs 作为大型 C++ 项目的 IDE

c++ - 是否可以从一个特定模板实例化的构造函数中删除关键字 "explicit"?