массив ссылок на c++
Я wounder, как я могу заставить этот код работать?
#include <iostream>
using namespace std;
void writeTable(int (&tab)[],int x){
    for(int i=0;i<x;i++){
        cout << "Enter value " << i+1 <<endl;
        cin >> tab[i] ;
    }
}
int main(void){
    int howMany;
    cout << "How many elemets" << endl;
    cin >> howMany;
    int table[howMany];
    int (&ref)[howMany]=table;
    writeTable(ref,howMany);
    return 0;
}
и вот ошибки, которые у меня есть:
|4|error: parameter ‘tab’ includes reference to array of unknown bound ‘int []’|
|18|error: invalid initialization of reference of type ‘int (&)[]’ from expression of type ‘int [(((unsigned int)(((int)howMany) + -0x00000000000000001)) + 1)]’|
|4|error: in passing argument 1 of ‘void writeTable(int (&)[], int)’|
Спасибо за помощь
5 ответов
Если вы собираетесь передать размер массива, то удалите ссылку
void f(int a[])
эквивалентно
void f(int* a)
таким образом, копирование не будет сделано, если это проблема.
Если вы хотите взять массив по ссылке, то вы должны указать измерение. например,
void f(int (&a)[10])
естественно, лучшим из двух является третье решение, которое должно использовать std:: vector и передавать их по ссылке, ссылке на const или по значению, если это необходимо. HTH
вот немного больше стиля C++ для этого:
#include <iostream>
#include <vector>
void writeTable(std::vector<int> &tab)
{
    int val;
    for (unsigned int i=0; i<tab.size(); i++)
    {
        std::cout << "Enter value " << i+1 << std::endl;
        if (std::cin >> val)
        {
            tab[i] = val;
        }
    }
}
int main()
{
    int howMany;
    std::cout << "How many elements?" << std::endl;
    std::cin >> howMany;
    std::vector<int> table(howMany);
    writeTable(table);
    return 0;
}
вам не нужно указывать размер массива, если вы делаете writeTable шаблон функции. 
template <typename T,size_t N>
void writeTable(T (&tab)[N]) //Template argument deduction
{
    for(int i=0 ; i<N ; i++){
       // code ....
    }
}
.
int table[howMany]; // C++ doesn't have Variable Length Arrays. `howMany` must be a constant
writeTable(table);  // type and size of `table` is automatically deduced
после ответа Amardeep, вот способ сделать это на C++11:
#include <iostream>
#include <vector>
void writeTable(std::vector<int> &tab)
{
    int val;
    for (auto& cell : tab)
    {
        std::cout << "Enter value " << i+1 << std::endl;
        if (std::cin >> val)
        {
            cell = val;
        }
    }
}
int main()
{
    int howMany;
    std::cout << "How many elements?" << std::endl;
    std::cin >> howMany;
    std::vector<int> table(howMany);
    writeTable(table);
    return 0;
}
обратите внимание на диапазон на основе for в writeTable.
массивы ссылок являются незаконными, если это то, что вы пытаетесь сделать. Это не на 100% ясно для меня из названия.