Похоже, вы сталкиваетесь с предположениями, сделанными на основе предыдущей реализации (Codewarrior). Например:
#include <iostream>
int main() {
std::cout << "string literal\n";
return 0;
}
Это зависит от iostream, в том числе от того, что не требуется объявлять: перегрузка operator<<(ostream&, char const*)
(это бесплатная функция, а не метод ostream, как другие). И чтобы быть полностью однозначным, #include <ostream>
также требуется выше. В C ++ в библиотечные заголовки разрешено включать любой другой библиотечный заголовок, так что эта проблема возникает всякий раз, когда кто-то непреднамеренно зависит от этого.
(То, что дополнительный заголовок требуется в этом конкретном случае, считается недостатком для многих, включая меня, и почти все реализации предоставляют объявление этой функции в iostream. Это все еще самый короткий, распространенный пример, который я знаю для проиллюстрируйте это.)
Это часто более тонкий и сложный, чем этот простой пример, но основная проблема та же. Решение состоит в том, чтобы проверить каждый заголовок, чтобы убедиться, что он включает в себя все библиотеки, которые ему требуются , начиная с тех, которые дают вам ошибки. Например. #include <vector>
и убедитесь, что вы используете std::vector
(чтобы не полагаться на его нахождение в глобальном пространстве имен, что делается в некоторых, в основном старых и устаревших в настоящее время реализациях) случаях, когда вы получаете «вектор не называет тип».
Возможно, вы также столкнулись с зависимыми типами , и в этом случае вы добавили бы typename.