вернуть const std::string*& из std::string *tab[11]

У меня есть массив строк в моем классе:

class A
{
   string*          tab[11];
   const string*&   getTab();
}

я наполняю его

константная строка &str

Моей первой мыслью было просто сделать:

return tab;

Но G++ говорит мне:

недопустимая инициализация неконстантной ссылки типа ‘const string*&’ из rvalue типа ‘std::string**’

Что я сделал не так ?

И что мне вернуть?

Заранее спасибо :)


person nsvir    schedule 19.01.2014    source источник
comment
Ваш возвращаемый тип является ссылкой на указатель. Вы возвращаете массив указателей, который затем распадается на указатель на указатель. Что вы на самом деле хотите вернуть?   -  person chris    schedule 19.01.2014
comment
Постоянная ссылка массива указателей   -  person nsvir    schedule 19.01.2014
comment
У вас есть массив указателей на строку, а не массив строк, как вы говорите.   -  person juanchopanza    schedule 19.01.2014


Ответы (2)


string*& — это ссылка на указатель на строку.
Но вы хотели бы вернуть ссылку на массив указателей на строку. Таким образом, вы должны вернуть тип string**& (конечно, он может быть и константным).

Другим решением было бы вместо необработанного массива использовать тип std::array<class T, std::size_t N>, чтобы ваш синтаксис был более понятным:

class A
{
    std::array<string*, 11> tab;
    const std::array<string*, 11>& getTab();
}

std::array — это очень легкая оболочка для необработанного c-массива, поэтому ее использование почти не влияет на производительность.

person Mark Vincze    schedule 19.01.2014
comment
Lucky op не набрал ‘string*& const’, что было бы константной ссылкой на первую строку - person user3125280; 19.01.2014

Проще всего объявить подходящий typedef:

class A
{
   typedef string Table[11];
   Table     tab;
   Table&    getTab();
};
person Marcelo Cantos    schedule 19.01.2014