代码之家  ›  专栏  ›  技术社区  ›  Campa Dominik Wójt

将基于堆的N元数组引用传递给函数

  •  1
  • Campa Dominik Wójt  · 技术社区  · 7 年前

    保持简单,对于一维阵列,以下是一个:

    #include <iostream>
    
    template <size_t N> int sign(int(&arr)[N], int i)
    {
        return (arr[i] >= 0) ? +1 : -1 ;
    }
    
    int main(int argn, char** argv)
    {
        const int SIZE = 2;
    
        int (*arr1d) = new int[SIZE];
        arr1d[0] = 12;
        arr1d[1] = -1;
    
        std::cout << "sign 0 : " << sign(arr1d, 0) << std::endl ;     
        std::cout << "sign 1 : " << sign(arr1d, 1) << std::endl ;
    }
    

    但这不会编译:

    Sign.cpp:17:50: error: no matching function for call to ‘sign(int*&, int)’
         std::cout << "sign 1 : " << sign(arr1d, 1) << std::endl ;
                                                  ^
    Sign.cpp:3:29: note: candidate: template<long unsigned int N> int sign(int (&)[N], int)
     template <size_t N> int sign(int(&arr)[N], int i)
                             ^~~~
    Sign.cpp:3:29: note:   template argument deduction/substitution failed:
    Sign.cpp:17:50: note:   mismatched types ‘int [N]’ and ‘int*’
         std::cout << "sign 1 : " << sign(arr1d, 1) << std::endl ;
    

    不

    有什么建议吗?


    2D情况下的相同错误:

    #include <iostream>
    
    template <size_t M, size_t N> int sign(int(&arr)[M][N], int i, int j)
    {
        return (arr[i][j] >= 0) ? +1 : -1 ;
    }
    
    int main(int argn, char** argv)
    {
        const int SIZE = 2;
    
        int (*arr2d)[SIZE] = new int[SIZE][SIZE];                           
        arr2d[0][0] = 12;
        arr2d[0][1] = -1;
        arr2d[1][0] = 32;
        arr2d[1][1] = -4;
    
        std::cout << "sign 0 1: " << sign(arr2d, 0, 1) << std::endl ;
    }
    

    1 回复  |  直到 7 年前
        1
  •  1
  •   Samer Tufail    7 年前

    尝试将指向数组的指针传递给符号函数。

    template <size_t M, size_t N> 
    int sign(int(*arr)[N], int i, int j)
    {
        return (arr[i][j] >= 0) ? +1 : -1 ;
    }
    

    std::cout << "sign 0 1: " << sign<SIZE, SIZE>(arr2d, 0, 1) << std::endl ;