【问题标题】:Compiler ignores if else编译器忽略 if else
【发布时间】:2013-09-10 04:17:04
【问题描述】:

我有这样的功能

template<typename Arg, typename... Args>
void input(Arg &arg, Args&... args) {

在那里我有一个 if 来检查 arg 是否是一个数组(我以不同的方式处理数组)。然后我尝试访问数组的索引,但我得到subscripted value is neither array nor pointer。如果我不混合数组和普通变量,这不会发生。我该怎么办?

【问题讨论】:

  • 如果if 语句是问题所在,为什么您只向我们展示if 之前6 行的代码?
  • 您可以从包含您要询问的代码开始,而不是描述它。
  • 欢迎来到 Stack Overflow。请尽快阅读About 页面。我认为您需要提供更多代码来显示您正在处理的内容。请研究如何创建 SSCCE (Short, Self-Contained, Correct Example),然后升级您的问题以提供一个。在这种情况下,它应该是最少的代码和一个编译的调用和一个不编译的调用,以及确切的错误消息。
  • 对问题进行一些编辑,它会再次启动并运行...

标签: c++ arrays gcc c++11 g++


【解决方案1】:

只需重载该函数以获取常规类型和数组类型,如下所示:

#include <iostream>

template <typename T>
void f(T t)
{
    std::cout<<"Regular version !\n";
}

template <typename T>
void f(T t[])
{
    std::cout<<"Array version !\n";
}

int main() 
{
    f(2); // Prints "Regular version !"
    int k[] = { 1, 2, 3 };
    f(k); // Prints "Array version !"
}

Working example

【讨论】:

  • T t[] 作为参数是不是数组类型!转化为指针T* t!要正确获取数组参数,您需要一个大小,然后形成对数组的引用:template&lt;class T, size_t N&gt; void f(T (&amp;t)[N])
  • 函数解析发生后数组衰减为指针,因此不影响这个
  • 不,它没有。函数本身在编译器看来实际上是这样的:template&lt;class T&gt; void f(T* t).
猜你喜欢
  • 2014-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多