Возможно, проблема в том, что words
- это std::shared_ptr
, а не std::vector
.std::shared_ptr::operator[]()
- это C ++ 17 (что означает, что он не будет компилироваться в C ++ 11), и даже тогда он не будет делать то, что вы думаете:
Возвращаемое значение
Ссылка на idx-й элемент массива, т. Е. Get () [idx]
Затем из * Документация 1018 * :
std :: shared_ptr :: get
T * get () const noexcept;(до C ++ 17)
element_type * get () const noexcept;(начиная с C ++ 17)
Это означает, что get()
возвращает указатель.Вместе это делает ваш код таким же, как:
std::vector<int>* ptr = nullptr; // Note that this data is probably allocated some how...
// Then, later...
ptr[index];
Это не то, что вам нужно.По сути, это функциональный эквивалент доступа к index
-ому элементу массива векторов (это более сложно, но я не знаю достаточно о технических различиях между указателями и массивами, чтобы правильно сформулировать его здесь).То, что вы хотите, это operator[]()
разыменованного указателя, например:
(*ptr)[index]; // Parenthesis for clarity. I don't think that they are technically necessary here.
То, что это сводится к следующему: то, что вы (вероятно) хотите, это оператор разыменования std::shared_ptr
:
return (*words)[st]; // again, parenthesis for clarity here.
// I don't think they are technically necessary here, either.
Это должно скомпилировать и делать то, что вы хотите.
Редактировать: Это привлекло мое внимание, благодаря Ответ Реми Лебо, что и прототип вашей функции нужно будет изменить, поскольку (*words)[st]
- это не std::shared_ptr<std::vector<std::string>>
, а просто std::string
.Таким образом, вместо этого замените прототип:
std::string& operator [](size_t st);
И в cpp:
std::string& sort::operator[](size_t st)
{
return (*words)[st];
}