2017-08-09 88 views
3

我寫了一個簡單的程序,將陣列array[]到名爲ARRAY_MAN功能,然後修改數組的內容:發送數組指針/參考模板

#include <vector> 
#include <iostream> 

template <class Var, class T, std::size_t N, class... Args> 
void ARRAY_MAN(Var variable, T(&)[N], uint32_t numParams, Args... args) 
{ 
    std::vector<T> arguments{args...}; 

    if(arguments.size() != numParams) 
     throw std::runtime_error("mismatch"); 

    for(uint32_t i = 0; i < numParams; ++i) 
     variable[i] = arguments[i]; 
} 


int main(int argc, char* argv[]) 
{ 
    int array[] = {1,2,3}; // (*) 

    // print array before sending 
    for(uint32_t i = 0; i < 3; ++i) 
     std::cout << array[i] << " "; 
    std::cout << std::endl; 

    ARRAY_MAN(array, array, 3, 34, 56, 10); 

    // print array after sending 
    for(uint32_t i = 0; i < 3; ++i) 
     std::cout << array[i] << " "; 
    std::cout << std::endl; 

    return 0; 
} 

這編譯和運行。但是,如果我更換行標(*)這一行:

int *array = new int(3); 

我得到這個錯誤:

no matching function for call to ‘ARRAY_MAN(int*&, int*&, int, int, int, int)’

如何發送本次array到ARRAY_MAN功能?

+3

int * array = ...中的'array'是一個指針,而不是一個數組。你的函數需要一個數組。 – juanchopanza

回答

2

剛剛看完編譯錯誤消息:

$ g++ --std=c++14 -o a a.cpp 
a.cpp: In function ‘int main(int, char**)’: 
a.cpp:26:42: error: no matching function for call to ‘ARRAY_MAN(int*&, int*&, int, int, int, int)’ 
    ARRAY_MAN(array, array, 3, 34, 56, 10); 
             ^
a.cpp:5:6: note: candidate: template<class Var, class T, long unsigned int N, class ... Args> void ARRAY_MAN(Var, T (&)[N], uint32_t, Args ...) 
void ARRAY_MAN(Var variable, T(&)[N], uint32_t numParams, Args... args) 
    ^
a.cpp:5:6: note: template argument deduction/substitution failed: 
a.cpp:26:42: note: mismatched types ‘T [N]’ and ‘int*’ 
    ARRAY_MAN(array, array, 3, 34, 56, 10); 

的第二個參數的功能是將固定長度的數組的引用,而不是一個指針的引用。如果你的函數參數是T[],T[N]T*,那麼所有的(AFAICR)就是一樣的東西 - 拿一個指針。但定長陣列參考文獻是特殊的。另請參見:

What is useful about a reference-to-array parameter?

你可以說這是一種方式來獲得過去與C向後兼容,並具有「真正的」數組函數的參數。