当前位置: 首页 > 知识库问答 >
问题:

为什么gcc不能推导出数组参数的模板大小?(C++11)

梁丘璞瑜
2023-03-14
#include <iostream>
#include <array>

template <typename T, int N>
std::ostream & operator <<(std::ostream & os, const std::array<T, N> & arr) {
  int i;
  for (i=0; i<N-1; ++i)
    os << arr[i] << " ";
  os << arr[i];
  return os;
}

int main() {
  std::array<double, 2> lower{1.0, 1.0};
  std::cout << lower << std::endl;
  return 0;
}
  1. 有人知道为什么gcc不能自动绑定这个吗?
  2. 使用显式指定的模板参数调用 <<运算符的语法是什么?

回答问题2:运算符<< (std::cout,lower);

编辑:以下函数也是如此,它只在数组大小中模板化:

template <int N>
void print(const std::array<double, N> & arr) {
  std::cout << "print array here" << std::endl;
}

int main() {
  std::array<double, 2> lower{1.0, 1.0};
  print<2>(lower); // this works
  print(lower);    // this does NOT work
  return 0;
}

共有1个答案

南宫喜
2023-03-14

考虑您的声明:

template <typename T, int N>
std::ostream & operator <<(std::ostream & os, const std::array<T, N> & arr) {

std::array的定义是:

template<typename T, std::size_t N> class array {...};

您使用的是int而不是std::size_t,这就是它不匹配的原因。

 类似资料:
  • 以下内容将无法编译: null 我不明白这里到底出了什么问题。为什么编译器不能从函数参数推导出模板参数? 我需要做什么才能让这个工作?

  • 但是这个技巧在零数组的情况下不起作用。为什么下面的代码不正确?例如,联机编译器ideone打印以下错误消息: 错误:调用'size_of_array(int[0])' std::size_t num=size_of_array(arr)没有匹配的函数;

  • 我正在尝试编写一个简单的模板,我可以使用该模板对带有单个参数的函数进行记忆: 但我得到了一个错误: 错误:没有匹配函数来调用“备忘录(双精度)” 注:候选人是: 注意:模板OUT记忆(IN) 注意:模板参数扣除/替换失败: 为什么编译失败? 实际上,当我指定所有模板参数时,我不明白为什么模板参数推导/替换会发生。 我使用的是gcc版本4.7.2(未启用C 11) PS:模板的错误比我最初意识到的要

  • 我已经编写了一个具有递归评估的可变参数模板函数。对于最后一个参数,我在没有可变参数包的情况下实现了专业化,并且一切正常。 现在我想把可变函数参数转换成模板参数。 这是我的尝试: gcc和clang报告了一个模糊的过载,并且无法使用空参数包在“专业化”和“可变参数”之间做出决定。 我尝试删除特化并检查可变参数模板中的包大小,但是如果没有特化,编译器就无法推断出参数“p”。

  • 使用以下代码生成时 生成以下诊断(代码后): 诊断: 有趣的部分不是关于歧义错误本身(这不是这里主要关注的问题)。有趣的是,当仅使用函数名调用fun时,第一个fun的模板参数F被解析为纯函数类型double(double),而第二个fun的模板参数F被解析为更期望的函数指针类型。 然而,当我们将调用<代码>乐趣(测试) 更改为<代码>乐趣( 这种行为似乎是所有Clang和GCC(以及Visual

  • 我一直在研究一个深度学习库,自己写作。在矩阵运算中,获得最佳性能对我来说是一个关键。我一直在研究编程语言及其对数字运算的性能。过了一段时间,我发现C#SIMD具有与C++SIMD非常相似的性能。所以,我决定用C#编写这个库。 首先,我测试了C#SIMD(我测试了很多东西,但是这里不写了)。我注意到,当使用较小的数组时,它的工作效果要好得多。当使用较大的数组时,效率不高。我觉得很可笑。通常情况下,当

  • 我想知道我是否可以自动推断数组的大小,它作为模板参数传递,而不(显式地)传递它的大小。 null

  • 我有一个下面的类模板 给出以下错误: tmp.cc:19:27:错误:无法专门化(使用“template<>”)未专门化模板constexpr int MyClass::ArraySize<0>()的成员{return 0;} 有可能达到预期的行为吗?使用C++14/C++17特性的解决方案(我想如果-constexpr应该是可能的)受到欢迎,但不能解决我的特定问题,因为只有C++11可用。