事实上,我的意思并不是对我的问题进行完整而详尽的回答,否则我可以简单地被发送到cppreference来阅读这个巨大的阅读。也许有一天我会做,但目前我的英语水平不允许我做太多。但是我想大致了解一下他是如何决定推断类型的,具体我会用一个例子来分析我的问题:
#include <iostream>
template <typename T>
T** createarray(int n, int m) {
T** mas = new T*[n];
for (int i = 0; i < n; i++) {
mas[i] = new T[m];
}
return mas;
}
int main()
{
int n, m;
std::cin >>n >> m;
double **arr = createarray(n, m);
}
我想创建一个二维数组,而数组元素可以是任何类型。但是代码无法编译,而且通常很清楚为什么。我正在尝试调用一个似乎不理解T
. 例如,如果函数是这样的:
T** createarray(int n, int m, T another_argument) {
T** mas = new T*[n];
for (int i = 0; i < n; i++) {
mas[i] = new T[m];
}
return mas;
}
然后,一般来说,我们必须首先弄清楚传递给我们的类型是什么,并且函数将是相同的类型,这一点变得更加清楚。然而,在上下文中double **arr = createarray(n, m)
LIKE HOW 很清楚该功能也必须是双重的?但是,这里又出现了一个问题,我能不能推导出函数的类型,比如说是int,然后强制转换为double?事实证明,我可以将其转换为任何类型,然后隐式转换。但是,如果我将一些更复杂的数据结构作为字符串传递怎么办?向量?不会再有这样的模棱两可了。然而,这个想法并没有消除编译错误。尽管总的来说,由于我不太确定 C++ 是如何真正尝试推断类型,因此这些想法并没有太大的根据。它实际上是否使用参数输出它们?有没有办法让我的函数在不明确指定类型的情况下工作:double **arr = createarray<double>(n, m)
.
正如您已经注意到的,参数的输出不受函数返回值的使用方式的影响。
除了唯一的例外,模板化
operator
转换欧姆:然后
double **arr = createarray(m, n);
它将起作用。