У меня есть устаревший код, написанный на BorlandC++ с использованием Tlist и других специальных классов Borland. Я полный нуб в STL.
Я не могу понять, как повторно объявить конструктор, который выглядит так:
MyData (TStringList *fileList)
объявление ниже дает ошибку «отсутствует» «)» ! (скомпилировано в BorlandC++/embarcadero)
MyData (std:list<string> *fileList)
Что не так выше? как это должно быть объявлено с помощью std:list
(Я знаю, что придется изменить много кода, поскольку TStringList не имеет тех же методов, что и std:list.)
std::list — название шаблона; это не может быть тип аргумента, потому что это не тип. Угадайте, из TStringList, возможно, вы ищете MyData(const std::list<std::string>& fileList)?
Правильно ли вы использовали #include <list> в своем коде?
Когда-то я работал с библиотекой классов Borland (до STL). То, что вы пытаетесь сделать, одновременно и благородно, и очень разочаровывает. Особенно, если вы полный нуб в STL. Первое, что нужно сделать, это прочитать о стандартной библиотеке C++, которая взяла STL и продолжила ее развитие. Я рекомендую книгу Страуструпа «Язык программирования C++» (4-е издание).
TStringList также имеет совершенно другое поведение в отношении уведомлений других компонентов об изменениях, внесенных в экземпляр. Наверное, это не такая уж хорошая идея. чтобы заменить это на std::list<std::string>. Кроме того, я бы предпочел использовать std::vector<std::string>, если вы действительно уверены, что можете его заменить.
Почему std:list<string> с одним двоеточием? Должно быть std::list<string> (двойное двоеточие).
Крутое это место! Спасибо всем.
@ user463035818, потому что AnsiString, List и StringList недоступны в VisualC (я полагаю)
@Eljay, спасибо, боюсь, впереди много работы! :D .@πάντα ῥεῖ Интересное предложение об использовании вектора, я рассмотрю это. И да, одно двоеточие было досадной ошибкой :)
К вашему сведению, TStringList содержит динамический массив строк, поэтому он будет ближе к std::vector<std::string>, чем к std::list<std::string>, который представляет собой двусвязный список, а не массив. Не позволяйте именам обмануть вас. Вы должны понимать семантику, чтобы эффективно переводить. Вы можете подумать о написании собственного класса TStringList, который имеет тот же открытый интерфейс, что и класс Borland, но внутри использует STL. То же самое с AnsiString и другими классами Borland. Таким образом, у вас будет меньше кода для перевода





Пространства имен использовать оператор разрешения области видимости ::, а не одно двоеточие :
И list, и string находятся в пространстве имен std, поэтому доступ к ним осуществляется с помощью ::.
Это работает: MyData(std::list<std::string> *fileList)
Из комментария Томаса Мэтьюза: передача по ссылке предпочтительнее передачи по указателю: MyData(std::list<std::string> &fileList)
Кроме того, передача по ссылке предпочтительнее передачи по указателю.
@ThomasMatthews Я предпочитаю передачу по указателю, если фактический объект будет изменен. При вызове функции неясно, будет ли изменен объект, если вы используете передачу по ссылке: MyData(&fileList) vs MyData(fileList).
Если вы не хотите, чтобы объект был изменен, перейдите по ссылке const. Это должно быть достаточно ясно.
они const ключевое слово позволяет четко сообщить, что вы не касались этого объекта. Помните, что ссылка не может быть нулевой. указатели могут быть. это безопасно, вы выделяете нулевые проверки, если вы проходите по ссылкам
почему вы хотите заново объявить конструктор для начала? У них не только разные методы, но и два разных типа