Программа по вычислениям полностью устраивает, она перемножает 2 матрицы указанного размера с рандомными числами, она запускается и правильно считает, но показывает, что есть ошибки типа: cin, cout, system не являются однозначными, всего 17 ошибок, подчеркивает красным эти операторы, как это убрать?
#include <iostream>
#include <ctime>
#include <iomanip>
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");
int** P1, ** P2, ** P3, n, m;
cout << "Введите кол-во строк матрицы: ";
cin >> n;
cout << "Введите кол-во столбцов матрицы: ";
cin >> m;
P1 = new int* [n];
for (int i = 0; i < n; i++)
P1[i] = new int[m];
srand(time(0));
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++) //рандом 1 матрицы
P1[i][j] = rand() % 10;
for (int i = 0; i < n; i++)
{
cout << endl; //вывод 1 матрицы
for (int j = 0; j < m; j++)
{
cout << setw(3) << P1[i][j] << "t";
}
}
cout << endl;
int k;
cout << "Введите кол-во столбцов 2 матрицы: ";
cin >> k;
P2 = new int* [k];
for (int i = 0; i < m; i++)
P2[i] = new int[k];
for (int i = 0; i < m; i++)
for (int j = 0; j < k; j++) //рандом 2 матрицы
P2[i][j] = rand() % 10;
for (int i = 0; i < m; i++)
{
cout << endl; //вывод 2 матрицы
for (int j = 0; j < k; j++)
{
cout << setw(3) << P2[i][j] << "t";
}
}
cout << endl;
P3 = new int* [n];
for (int i = 0; i < n; i++)
P3[i] = new int[k];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < k; j++) //умножение матриц
{
P3[i][j] = 0;
for (int z = 0; z < m; z++)
P3[i][j] = P3[i][j] + P1[i][z] * P2[z][j];
}
}
cout << endl << "Результат умножения:" << endl;
for (int i = 0; i < n; i++) //вывод результата
умножения
{
cout << endl;
for (int j = 0; j < k; j++)
cout << setw(3) << P3[i][j] << "t";
}
cout << endl;
for (int i = 0; i < n; i++)
delete[] P1[i];
delete[] P1;
for (int i = 0; i < m; i++)
delete[] P2[i];
delete[] P2;
for (int i = 0; i < n; i++)
delete[] P3 [i];
delete[] P3;
system("pause");
return 0;
}
0 / 0 / 0 Регистрация: 07.01.2023 Сообщений: 6 |
|
1 |
|
23.03.2023, 13:30. Показов 1330. Ответов 14
Написала код, всё работает прекрасно, но через какое-то время появляется 90+ ошибок “cout не является однозначным” и код не компилируется (using namespace std есть, да и код работал), раньше эту проблему удавалось решить переписав строку “using namespace std” или просто убрав “;” и вернув её обратно, но сейчас это уже не помогает. Поискала решение, некоторые перезапускают VS, это помогло, но ошибка появляется очень часто и постоянно перезапускать программу неудобно. Подскажите, может есть ещё какие-то способы это решить.
0 |
Лежебока 292 / 212 / 91 Регистрация: 12.05.2021 Сообщений: 1,244 |
|
23.03.2023, 13:31 |
2 |
moolingtoon, предоставьте пример и проблемы, а там будет видно,наверно
0 |
Нарушитель 8583 / 4588 / 1058 Регистрация: 12.03.2015 Сообщений: 21,515 |
|
23.03.2023, 13:33 |
3 |
Подскажите, может есть ещё какие-то способы это решить. Что за программного монстра ты рожаешь? Для этого использование MSVC необходимо?
0 |
moolingtoon 0 / 0 / 0 Регистрация: 07.01.2023 Сообщений: 6 |
||||
23.03.2023, 13:56 [ТС] |
4 |
|||
вот небольшой кусочек, ошибка выделяет все строчки там где есть cout
0 |
Нарушитель 8583 / 4588 / 1058 Регистрация: 12.03.2015 Сообщений: 21,515 |
|
23.03.2023, 14:04 |
5 |
вот небольшой кусочек, ошибка выделяет все строчки там где есть cout Проблема явно в самой IDE и/или в мокрософтовском компиляторе.
0 |
0 / 0 / 0 Регистрация: 07.01.2023 Сообщений: 6 |
|
23.03.2023, 14:06 [ТС] |
6 |
у меня тоже работает, до определенного момента, через какое-то время появляется ошибка, раньше чинить её получалось а вот сейчас никак
0 |
Нарушитель 8583 / 4588 / 1058 Регистрация: 12.03.2015 Сообщений: 21,515 |
|
23.03.2023, 14:08 |
7 |
у меня тоже работает, до определенного момента, через какое-то время появляется ошибка, раньше чинить её получалось а вот сейчас никак Я просил:
Для этого использование MSVC необходимо?
0 |
0 / 0 / 0 Регистрация: 07.01.2023 Сообщений: 6 |
|
23.03.2023, 14:12 [ТС] |
8 |
курсовая по с++, начала работу естественно в VS, не думаю что переходить на новую среду будет удобно
0 |
Нарушитель 8583 / 4588 / 1058 Регистрация: 12.03.2015 Сообщений: 21,515 |
|
23.03.2023, 14:14 |
9 |
курсовая по с++, начала работу естественно в VS Почему естественно?
не думаю что переходить на новую среду будет удобно Почему?
0 |
Нарушитель 8583 / 4588 / 1058 Регистрация: 12.03.2015 Сообщений: 21,515 |
|
23.03.2023, 14:19 |
10 |
MSVC – это не для курсовых и лаб, а для чего-то грандиозного, с окошками, например. Для мелких консольных проектов можно юзать и что-то попроще.
0 |
0 / 0 / 0 Регистрация: 07.01.2023 Сообщений: 6 |
|
23.03.2023, 14:26 [ТС] |
11 |
изначально изучение языка начали в VS и постоянно работали в нём
0 |
Нарушитель 8583 / 4588 / 1058 Регистрация: 12.03.2015 Сообщений: 21,515 |
|
23.03.2023, 14:32 |
12 |
изначально изучение языка начали в VS и постоянно работали в нём А, ну это другое дело!
научиться кодить, а тут вон оно чо, Михалыч!
0 |
фрилансер 4754 / 4356 / 924 Регистрация: 11.10.2019 Сообщений: 11,426 |
|
23.03.2023, 14:40 |
13 |
using namespace std есть вот и плохо. Убирай его и везде к его идентификаторам приписывай Добавлено через 1 минуту Добавлено через 1 минуту
но через какое-то время появляется 90+ ошибок точно
0 |
Лежебока 292 / 212 / 91 Регистрация: 12.05.2021 Сообщений: 1,244 |
|
23.03.2023, 15:00 |
14 |
курсовая по с++, начала работу естественно в VS, не думаю что переходить на новую среду будет удобно Если там нет ничего супер-пупер навороченного, то попробуй другую среду(dev-c++, codeblocks),на крайняк можно онлайн компилятор
0 |
Вездепух 10879 / 5884 / 1603 Регистрация: 18.10.2014 Сообщений: 14,685 |
|
23.03.2023, 17:32 |
15 |
у меня тоже работает, до определенного момента, через какое-то время появляется ошибка, раньше чинить её получалось а вот сейчас никак Так не бывает и вы что-то выдумываете. Разумеется, если ошибка есть, то никакие “переходы на другую IDE” тут не помогут.
ошибка выделяет все строчки там где есть cout “Выделяет”? Что значит “выделяет”?
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
23.03.2023, 17:32 |
Помогаю со студенческими работами здесь Ошибка компиляции: “ref” не является однозначным “count” не является однозначным, проблема в коде Ошибка компиляции “Е0266, х не является однозначным” Есть класс Tank, являющийся наследником Rectangle, который, в свою очередь,… Странная ошибка volatile int count – count не является однозначным. Ещё про CloseHandle – для чего это? Найти причины ошибки: cout не является членом std Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 15 |
Добавлено 23 июня 2021 в 13:16
В предыдущем уроке («8.10 – Различение перегруженных функций») мы обсудили, какие атрибуты функции используются для различения перегруженных функций друг от друга. Если перегруженная функция не отличается должным образом от других перегрузок с тем же именем, компилятор выдаст ошибку компиляции.
Однако наличие набора различающихся перегруженных функций – это только половина картины. Когда выполняется какой-либо вызов функции, компилятор также должен гарантировать, что можно найти соответствующее объявление функции.
В случае неперегруженных функций (функций с уникальными именами) существует только одна функция, которая потенциально может соответствовать вызову функции. Эта функция либо соответствует (или может быть выполнено соответствие после применения преобразования типов), либо нет (и возникает ошибка компиляции). С перегруженными функциями может быть много функций, которые потенциально могут соответствовать вызову функции. Поскольку вызов функции может разрешить только одну из них, компилятор должен определить, какая перегруженная функция лучше всего подходит. Процесс сопоставления вызовов функций с конкретной перегруженной функцией называется разрешением перегрузки.
В простых случаях, когда тип аргументов функции и тип параметров функции точно совпадают, это (обычно) просто:
#include <iostream>
void print(int x)
{
std::cout << x;
}
void print(double d)
{
std::cout << d;
}
int main()
{
print(5); // 5 - это int, поэтому это соответствует print(int)
print(6.7); // 6.7 - это double, поэтому это соответствует print(double)
return 0;
}
Но что происходит в случаях, когда типы аргументов в вызове функции не совсем соответствуют типам параметров ни в одной из перегруженных функций? Например:
#include <iostream>
void print(int x)
{
std::cout << x;
}
void print(double d)
{
std::cout << d;
}
int main()
{
print('a'); // char не совпадает с int или double
print(5l); // long не совпадает с int или double
return 0;
}
Тот факт, что здесь нет точного совпадения, не означает, что соответствие не может быть найдено – в конце концов, тип char
или long
можно неявно преобразовать в int
или double
. Но какое преобразование лучше всего выполнить в каждом конкретном случае?
В этом уроке мы исследуем, как компилятор сопоставляет заданный вызов функции с конкретной перегруженной функцией.
Разрешение вызовов перегруженных функций
Когда выполняется вызов перегруженной функции, компилятор выполняет последовательность правил, чтобы определить, какая из перегруженных функций (если она есть) лучше всего подходит.
На каждом шаге в вызове функции компилятор применяет к аргументу(ам) кучу различных преобразований типов. Для каждого примененного преобразования компилятор проверяет, соответствует ли какая-либо из перегруженных функций. После того, как все преобразования различных типов были применены и проверены на совпадения, этап завершен. Результатом будет один из трех возможных исходов:
- Подходящих функций не найдено. Компилятор переходит к следующему шагу в последовательности.
- Обнаружена единственная соответствующая функция. Эта функция считается наиболее подходящей. Теперь процесс сопоставления завершен, и последующие шаги не выполняются.
- Найдено более одной соответствующей функции. Компилятор выдаст ошибку компиляции о неоднозначном совпадении. Об этом случае поговорим чуть позже.
Если компилятор достигает конца всей последовательности, не найдя совпадения, он сгенерирует ошибку компиляции, что для вызова функции не может быть найдена соответствующая перегруженная функция.
Последовательность сопоставления аргументов
Шаг 1) Компилятор пытается найти точное совпадение. Это происходит в два этапа. Во-первых, компилятор смотрит, существует ли перегруженная функция, в которой тип аргументов в вызове функции точно соответствует типу параметров в перегруженных функциях. Например:
void print(int)
{
}
void print(double)
{
}
int main()
{
print(0); // точное совпадение с print(int)
print(3.4); // точное совпадение с print(double)
return 0;
}
Поскольку 0 в вызове функции print(0)
является int
, компилятор будет проверять, была ли объявлена перегрузка print(int)
. Поскольку это так, компилятор определяет, что print(int)
является точным совпадением.
Во-вторых, компилятор применит ряд тривиальных преобразований к аргументам в вызове функции. Тривиальные преобразования – это набор определенных правил преобразования, которые изменяют типы (без изменения значения) с целью поиска совпадения. Например, неконстантный тип можно тривиально преобразовать в константный тип:
void print(const int)
{
}
void print(double)
{
}
int main()
{
int x { 0 };
print(x); // x тривиально конвертируется в const int
return 0;
}
В приведенном выше примере мы вызвали print(x)
, где x
– это число int
. Компилятор тривиально преобразует x
из int
в const int
, который затем соответствует print(const int)
.
Для продвинутых читателей
Преобразование не ссылочного типа в ссылочный тип (или наоборот) также является тривиальным преобразованием).
Совпадения, полученные с помощью тривиальных преобразований, считаются точными совпадениями.
Шаг 2) Если точное совпадение не найдено, компилятор пытается найти совпадение, применяя к аргументу(ам) числовое продвижение. В уроке «8.2 – Продвижение целочисленных типов и типов с плавающей запятой» мы рассмотрели, как некоторые узкие целочисленные типы и типы с плавающей запятой могут автоматически преобразовываться в более широкие типы, такие как int
или double
. Если после числового продвижения совпадение найдено, вызов функции разрешен.
Например:
void print(int)
{
}
void print(double)
{
}
int main()
{
print('a'); // расширяющее преобразование для соответствия print(int)
print(true); // расширяющее преобразование для соответствия print(int)
print(4.5f); // расширяющее преобразование для соответствия print(double)
return 0;
}
Для print('a')
, поскольку точное совпадение для print(char)
не может быть найдено на предыдущем шаге, компилятор преобразует char
‘a‘ в int
и ищет совпадение. Это соответствует print(int)
, поэтому вызов функции разрешается как print(int)
.
Шаг 3) Если совпадение не найдено с помощью числового продвижения, компилятор пытается найти совпадение, применяя к аргументам числовые преобразования (8.3 – Числовые преобразования).
Например:
#include <string> // для std::string
void print(double)
{
}
void print(std::string)
{
}
int main()
{
print('a'); // 'a' преобразовано для соответствия с print(double)
return 0;
}
В этом случае, поскольку нет print(char)
(точное совпадение) и print(int)
(совпадение при числовом продвижении), ‘a‘ численно преобразуется в double
и сопоставляется с print(double)
.
Ключевые выводы
Совпадения, полученные с помощью числовых продвижений (расширяющих преобразований), имеют приоритет над любыми совпадениями, полученными с помощью числовых преобразований.
Шаг 4) Если совпадение не найдено с помощью числового преобразования, компилятор пытается найти совпадение с помощью любых пользовательских преобразований. Хотя мы еще не рассмотрели пользовательские преобразования, некоторые типы (например, классы) могут определять преобразования в другие типы, которые могут быть вызваны неявно. Вот пример, чтобы проиллюстрировать суть:
// Мы еще не рассмотрели классы, поэтому не волнуйтесь, если это вам пока непонятно
class X
{
public:
operator int() { return 0; } // пользовательское преобразование из X в int
};
void print(int)
{
}
void print(double)
{
}
int main()
{
X x;
print(x); //X преобразуется в int
return 0;
}
В этом примере компилятор сначала проверит, существует ли точное совпадение с print(X)
. Мы не определили такой функции. Затем компилятор проверит, можно ли применить к x
числовое продвижение, чего он не может. Затем компилятор проверит, можно ли применить к x
числовое преобразование, чего он также не может. Наконец, компилятор будет искать любые пользовательские преобразования. Поскольку мы определили пользовательское преобразование из X
в int
, компилятор преобразует X
в int
, чтобы соответствовать print(int)
.
Шаг 5) Если совпадение не найдено с помощью пользовательского преобразования, компилятор будет искать соответствующую функцию, которая использует многоточие.
Шаг 6) Если к этому моменту совпадений не найдено, компилятор сдается и выдает ошибку компиляции о невозможности найти подходящую функцию.
Неоднозначные совпадения
С неперегруженными функциями каждый вызов функции либо будет преобразован в функцию, либо совпадение не будет найдено, и компилятор выдаст ошибку компиляции:
void foo()
{
}
int main()
{
foo(); // ok: совпадение найдено
goo(); // ошибка компиляции: совпадений не найдено
return 0;
}
С перегруженными функциями есть третий возможный результат: может быть найдено неоднозначное совпадение. Неоднозначное совпадение возникает, когда компилятор находит две или более функции, которые могут быть сопоставлены на одном шаге. Когда это произойдет, компилятор прекратит сопоставление и выдаст ошибку компиляции, заявив, что он обнаружил неоднозначный вызов функции.
Поскольку каждая перегруженная функция для компиляции должна быть различаться, вам может быть интересно, как это возможно, что вызов функции может привести к более чем одному совпадению. Давайте посмотрим на пример, который это иллюстрирует:
void print(int x)
{
}
void print(double d)
{
}
int main()
{
print(5l); // 5l имеет тип long
return 0;
}
Поскольку литерал 5l имеет тип long
, компилятор сначала проверяет, может ли он найти точное совпадение для print(long)
, но не найдет его. Затем компилятор попробует выполнить числовое продвижение, но значения типа long
не могут быть расширены, поэтому здесь тоже нет совпадений.
После этого компилятор попытается найти совпадение, применив числовые преобразования к аргументу long
. В процессе проверки всех правил преобразования чисел компилятор найдет два возможных совпадения. Если аргумент long
численно преобразован в int
, тогда вызов функции будет соответствовать print(int)
. Если вместо этого аргумент long
преобразуется в double
, тогда он будет соответствовать print(double)
. Поскольку посредством числового преобразования были обнаружены два возможных совпадения, вызов функции считается неоднозначным.
В Visual Studio 2019 это приводит к следующему сообщению об ошибке:
error C2668: 'print': ambiguous call to overloaded function
message : could be 'void print(double)'
message : or 'void print(int)'
message : while trying to match the argument list '(long)'
Ключевые выводы
Если компилятор находит несколько совпадений на данном шаге, результатом будет неоднозначный вызов функции. Это означает, что ни одно совпадение на данном шаге не считается лучшим, чем любое другое совпадение на том же шаге.
Вот еще один пример, который дает неоднозначные совпадения:
void print(unsigned int x)
{
}
void print(float y)
{
}
int main()
{
print(0); // int можно численно преобразовать в unsigned int или float
print(3.14159); // double можно численно преобразовать в unsigned int или float
return 0;
}
Хотя вы можете ожидать, что 0 приведет к print(unsigned int)
, и 3.14159 приведет к print(float)
, оба этих вызова приводят к неоднозначному совпадению. Значение 0 типа int
может быть численно преобразовано в unsigned int
или float
, поэтому обе перегрузки соответствуют одинаково хорошо, и результатом является неоднозначный вызов функции.
То же самое относится к преобразованию числа типа double
в тип float
или unsigned int
. Оба являются числовыми преобразованиями, поэтому обе перегрузки соответствуют одинаково, и результат снова неоднозначен.
Разрешение неоднозначных совпадений
Поскольку неоднозначные совпадения являются ошибкой времени компиляции, их необходимо устранить, прежде чем ваша программа будет компилироваться. Есть несколько способов разрешить неоднозначные совпадения:
- Часто лучший способ – просто определить новую перегруженную функцию, которая принимает параметры именно того типа, с которым вы пытаетесь ее вызвать. Тогда C++ сможет найти точное совпадение для вызова функции.
- В качестве альтернативы явно приведите неоднозначные аргументы к типу функции, которую хотите вызвать. Например, чтобы
print(0)
вызывалprint(unsigned int)
, вы должны сделать это:int x{ 0 }; print(static_cast<unsigned int>(x)); // вызовет print(unsigned int)
- Если ваш аргумент является литералом, вы можете использовать суффикс литерала, чтобы убедиться, что ваш литерал интерпретируется как правильный тип:
print(0u); // вызовет print(unsigned int), поскольку суффикс 'u' = unsigned int
Список наиболее часто используемых суффиксов можно найти в уроке «4.13 – Литералы».
Сопоставление функций с несколькими аргументами
Если аргументов несколько, компилятор по очереди применяет правила сопоставления к каждому аргументу. Выбирается так функция, для которой каждый аргумент соответствует по крайней мере так же хорошо, как и у всех других функций, причем по крайней мере один аргумент соответствует лучше, чем у всех других функций. Другими словами, выбранная функция должна обеспечивать лучшее соответствие, чем все другие функции-кандидаты, по крайней мере, по одному параметру и не хуже по всем остальным параметрам.
В случае, если такая функция будет найдена, это явный и однозначно лучший выбор. Если такая функция не найдена, вызов будет считаться неоднозначным (или без совпадений).
Например:
#include <iostream>
void print(char c, int x)
{
std::cout << 'a';
}
void print(char c, double x)
{
std::cout << 'b';
}
void print(char c, float x)
{
std::cout << 'c';
}
int main()
{
print('x', 'a');
}
В приведенной выше программе все функции точно соответствуют по первому аргументу. Однако верхняя функция соответствует по второму параметру через числовое продвижение, тогда как другие функции требуют числового преобразования. Таким образом, print(char, int)
однозначно является лучшим совпадением.
Теги
C++ / CppLearnCppДля начинающихОбучениеПерегрузка (программирование)Программирование
Избавляемся от ошибки «This function or variable may be unsafe» в Visual Studio
Время чтения: 5 минут
Компилятор в Visual Studio сильно отличается от привычных большинству программистов GCC или CLANG, из-за чего при написании кода на C или C++ очень часто возникают неожиданные проблемы в виде ошибки использования стандартных функций, например, scanf, fopen, sscanf и тому подобным. Студия предлагает заменять функции на безопасные (повезёт, если нужно просто добавить _s к функции с ошибкой, но нередко в этих функциях идёт иной набор аргументов, нежели в обычной программе). Если вы не готовы с этим мириться, то этот пост для вас!
Давайте для начала создадим обычный консольный проект в Visual Studio и напишем простенькую программу, которая запрашивает ввод двух чисел, вводит их и затем выводит на экран.
Попробовав выполнить сборку проекта, обнаружим те самые ошибки.
Чтобы Visual Studio не тратила ваши нервы, сделаем следующее:
1. Выберем пункт «Проект» в верхнем меню
2. В открывшемся списке щёлкнем по «Свойства название_проекта»
3. В появившемся окне выберем Свойства конфигурации , C/C++ , Препроцессор
4. В строке Определения препроцессора допишем в самый конец строку ;_CRT_SECURE_NO_WARNINGS
6. Попробуем заново выполнить сборку проекта:
Ошибки исчезли, сборка прошла успешно и программа прекрасно работает! Теперь можно писать код как обычно, не переживая о необычном поведении Visual Studio!
Программист, сооснователь programforyou.ru, в постоянном поиске новых задач и алгоритмов
Языки программирования: C, C++, Pascal, C#
Студент МГУ им. М.В. Ломоносова
А Вы знаете, что мы пишем программы на C, C++, C#, Pascal и Python?
Так что если Вам нужно написать программу на C/C++, C#, Pascal или Python — мы с радостью поможем с этим!
В том числе мы занимаемся репетиторством по информатике и программированию, а также готовим к ОГЭ и ЕГЭ!
Почему именно мы?
- Более 1800 выполненных заказов;
- Более 170 отзывов;
- Качественное решение
- Короткие сроки и привлекательные цены
- Различные акции и скидки
Как с нами связаться?
- группа Вконтакте: vk.com/programforyou
- наша почта: order@programforyou.ru
Programforyou — позвольте нам писать код для вас и вы получите качественное решение в короткие сроки по привлекательной цене!
Ошибка C2653: . не является существующим классом
Я продолжаю получать ту же ошибку, когда я определенно создал «non-existent» класс RandomNumGuesser .
Я уже позаботился о том, чтобы включить ; после закрытия каждого класса >
Не знаю, что еще сказать.
Я мог бы использовать опытный глаз, потому что я не вижу никаких проблем.
Кроме того, в данный момент я использую Visual 2013. Были включены предварительно скомпилированные заголовки.
2 Ответа
У вас есть синтаксическая ошибка. Есть и другие проблемы: getCurrentGuess не является частью класса RandomNumGuesser (то же самое с другими методами в классе Guesser ). Я считаю, что журнал ошибок был сокращен в вопросе.
Вот как должен выглядеть cpp
RandomNumGuess не имеет функций-членов
Однако вы определяете их в исходном файле.
Может быть, они должны быть абстрактными виртуальными функциями?
Вы также не можете определить конструктор по умолчанию для NumberGuesser и RandomNumGuesser .
Похожие вопросы:
Это серьезно действует мне на нервы. Этот код работал просто отлично раньше, я перезапустил IDE (Visual Studio 2010), и теперь внезапно код выходит из строя на меня. Журнал ошибок огромен, и я.
Я пытаюсь сослаться на структуру из другого класса в своем коде, и это дает мне ошибку, говоря, что у меня есть проблема синтаксиса. #pragma once #include Definitions.h #include GV.h #include UI.h.
Общий вопрос об интеграции Realm с существующим проектом. Другой фреймворк у меня есть класс User , который имеет кучу свойств. Есть ли в любом случае с Realm, что я могу просто сохранить этот.
Когда я запускаю эту программу, она говорит, что в этом файле есть ошибка под названием error C2653: ‘Application’ : is not a class or namespace name #include MyForm.h using namespace std; int.
Я понимаю, что многие люди задавали этот вопрос, и есть похожие на Stack Overflow, но я не могу их понять. Я надеюсь, что кто-то скажет мне, почему это происходит, но и что происходит. Я кодировал.
Я загружаю jsoncpp на Github. И построил и установил его с мезоном и ниндзя. Но когда я включаю в свою программу, я получил ошибку: ‘PrecisionType’ не является классом или.
Добрый день. Я начал изучать c++ , и у меня есть и проблема компиляции моего проекта. Если вы найдете какой-нибудь неисправный код, я буду рад, если вы мне скажете. У меня есть следующие.
Мои предыдущие вопросы касались одного и того же проекта: Один и два . Нет необходимости читать их; просто знайте, что я пытаюсь использовать родной C++ SDK в проекте Visual C++. Это гораздо.
В Laravel4 я хочу использовать модель, которая представляет собой Event , поступающую из моей базы данных. Таким образом, в app/models у меня есть моя модель Event , которая расширяет Eloquent.
Я работаю над некоторым программным обеспечением для моделирования, написанным на C++. В настоящее время, когда я пытаюсь построить свой код, я получаю 9 ошибок компиляции, все жалуются на три.
C++ для людей
std::cout
Часто встречающиеся ошибки стадии компиляции
Очень часто начинающие программисты впадают в суеверный ужас, когда видят, что компилятор нашел в тексте программы ошибку, но не понимают, в чем она заключается.
А если помножить этот факт на незнание английского языка («чего там ему не нравится. ») и слабое владение синтаксисом C++ («хм, а может, тут нужна точка с запятой…»), то проблема принимает масштаб катастрофы.
Тот факт, что компилятор в силу своих ограниченных возможностей изо всех сил старается объяснить, что конкретно неверно, не спасает ситуацию. Как быть, если гуглить неохота, а спросить не у кого?
В этом посте на правах копипаста с последующим переводом, дополнениями и исправлениями приведу описание наиболее распространенных сообщений об ошибках и предупреждений компилятора. Неприятность кроется в том факте, что разные компиляторы ругаются на одинаковые ошибки по-разному, а некоторые даже не замечают то, что другие принимают за ошибку. Все зависит от совести разработчиков компилятора, даты его выпуска, и др.
В качестве компилятора возьмем g++, который, в частности, может использоваться в среде Code::Blocks. Версия gcc (куда входит g++) для ОС Windows зовется MinGW. По ходу я буду давать аналоги ошибок из лексикона русскоязычной Microsoft Visual C++.
Итак, частые ошибки:
undeclared identifier
doy.cpp: In function ‘int main()’:
doy.cpp:25: ‘DayOfYear’ undeclared (first use this function)
doy.cpp:25: (Each undeclared identifier is reported only once for each function it appears in.)
doy.cpp:25: parse error before ‘;’ token
2) Смысл
Использован идентификатор DayOfYear , но компилятор не нашел его объявления. Он не знает, что такое DayOfYear .
- Вы забыли включить какой-то заголовочный файл ( #include. )
- Вы где-то ошиблись в написании идентификатора (при объявлении или использовании)
- Вы вообще забыли, что эту переменную надо объявить
Попытавшись скомпилировать это в Microsoft Visual C++, вы увидите:
error C2065: DayOfYear: необъявленный идентификатор
cout undeclared
xyz.cpp: In function ‘int main()’:
xyz.cpp:6: ‘cout’ undeclared (first use this function)
xyz.cpp:6: (Each undeclared identifier is reported only once for each function it appears in.)
2) Смысл
Суперклассика. Без комментариев.
- Вы забыли включить
- Вы забыли написать using namespace std;
jump to case label
switch.cpp: In function ‘int main()’:
switch.cpp:14: jump to case label
switch.cpp:11: crosses initialization of ‘int y’
2) Смысл
Смысл туманен
3) Когда бывает
Вы попытались объявить и инициализировать переменную (объект, указатель и т.п.) в метке case оператора выбора switch. Правилами C++ это запрещено.
В Microsoft Visual C++ эта ошибка зовется
error C2360: пропуск инициализации ‘y’ из-за метки ‘case’
Выход: заключите операторы этого case’а в фигурные скобки <>.
multi-line string / unterminated string
using namespace std;
вызовет бурную реакцию компилятора:
string.cpp:7:12: warning: multi-line string literals are deprecated
string.cpp: In function ‘int main()’:
string.cpp:7: ‘so’ undeclared (first use this function)
string.cpp:7: (Each undeclared identifier is reported only once for each function it appears in.)
string.cpp:7: parse error before ‘Mary’
string.cpp:8:28: warning: multi-line string literals are deprecated
string.cpp:8:28: missing terminating » character
string.cpp:7:12: possible start of unterminated string literal
2) Смысл
Компилятор думает, что мы хотим создать строковую константу с содержащимся в ней переносом строки, что-то типа
что не поддерживается языком. Также делается предположение о том, что мы, возможно, забыли поставить кавычки в конце первой строки. Собственно, так оно и есть.
3) Когда бывает
Когда не соблюдается правильное количество и положение кавычек в строковых литералах. Надо быть внимательнее.
Microsoft Visual C++ со свойственной ему детской непосредственностью, отметит, что нельзя делать переносы в строках и возмутится, где точка с запятой:
error C2001: newline в константе
error C2146: синтаксическая ошибка: отсутствие «;» перед идентификатором «cout»
comparison between signed and unsigned integer expressions
xyz.cpp: In function ‘int main()’:
xyz.cpp:54: warning: comparison between signed and unsigned integer expressions
2) Смысл
Это — предупреждение компилятора, которое говорит о том, что мы пытаемся сравнить (==, и т.д.) целочисленное выражение (может принимать положительные, отрицательные значения и 0) и беззнаковое целочисленное выражение (может быть только положительным, либо 0).
3) Когда бывает
Собственно, тогда и бывает. Напомню, что тип int по умолчанию знаковый, а некоторые функции (например, vector::size() ) возвращают unsigned int .
К примеру, следующий на первый взгляд безобидный код вызовет описываемое предупреждение:
Следует помнить, что в памяти знаковые и беззнаковые типы имеют разные внутренние представления, поэтому надо быть чертовски осторожными с указателями.
В Microsoft Visual C++ предупреждение выглядит так:
suggest parentheses around assignment used as truth value
xyz.cpp: In function `int main()’:
xyz.cpp:54: warning: suggest parentheses around assignment used as truth value
2) Смысл
Тоже классика. Компилятор предполагает (и в 99% случаев прав), что вы по ошибке включили в скобки в качестве условия для if/while/for вместо условного выражения выражение присваивания.
3) Когда бывает
Чаще всего — в if ‘ах, когда вместо «==» используется «=»
if (length = maxLength)
if (length == maxLength)
Заминка в том, что это не ошибка, т.к. в скомпилированной программе (если мы проигнорируем предупреждение) выражение присваивания (которое возвращает значение правого аргумента) во всех случаях, кроме тех, когда оно вернет 0 , будет преобразовано к true .
Вопрос по плюсам (error C2102: ‘&’ requires l-value)
Привет.
Такой вопрос:
значит тут будет ошибка.. error C2102: ‘&’ requires l-value
Нашёл тут вроде как объяснение.. И там говорят про локальную переменную.. Что типа я реально возвращаю временный объект типа int*. Это так ? То есть в стеке создаётся переменная и туда помещается значение int*, так ? Если так, то почему я не могу взять её адрес ?? Она же есть !
- =A=L=X=
- Постоялец
Gladiator
> Что типа я реально возвращаю временный объект типа int*. Это так ? То есть в
> стеке создаётся переменная и туда помещается значение int*, так ?
> Если так, то
> почему я не могу взять её адрес ?? Она же есть !
Ну вообще то можешь, но уже в следующем операторе команды функции оно не будет иметь смысла и корректного адреса, так что правильно ругается.
- Genx
- Удалён
>То есть в стеке создаётся переменная и туда помещается значение int*, так ?
Не в стеке. По умолчанию результат функции помещается не на стек, а в регистр EAX процессора (если он влезает туда).
- laMer007
- Удалён
Gladiator
Вы делаете что-то странное и за последствия я не ручаюсь, но думаю во время учебы нужно заниматься странными вещами.
Чтобы скомпилировалось достаточно что-то вроде:
- Zefick
- Постоялец
upd: специальное дополнение: приведённые два варианта неравносзачны, неоднозначны и не-ещё-что-хотите, если вы считаете их по какой-то причине некорректными для непоставленной задач, если они оскорбляют ваши религиозные чувства, доставляют вам батхёрт потому что их написал явист или ещё каким-то образом нарушают ваш внутренний мир, то просьба в треде об этом больше не писать 🙂
- nes
- Постоялец
Zefick
Приведенные тобой варианты не однозначны, первый не корректный для данной задачи.
- Gladiator
- Постоялец
=A=L=X=
> Ну вообще то можешь, но уже в следующем операторе команды функции оно не будет
> иметь смысла и корректного адреса, так что правильно ругается.
Почему не будет ? Стековая переменная держится в памяти пока жива переменная.. А жива она до тех пор, пока не покинула блок в котором объявлена.
- Gladiator
- Постоялец
Не решаю конкретной задачи, чисто академический интерес
- Gladiator
- Постоялец
аа.. всё дошло.. типа я беру адрес временной переменной, которая уничтожается после операции присваивания..
- PANDA
- Постоялец
Zefick
> int **pMember1 = &p;
> int **pMember2 = a.GetMember2();
Ты хочешь сказать, что это одно и то же? Может, ты лучше будешь давать советы по жабе?
- susageP
- Постоялец
возможно прокатит как int*const & pMember = a.GetMember();
const продлевает жизнь временным объектам. возможно прокатит и с int.
Gladiator
> И там говорят про локальную переменную.. Что типа я реально возвращаю временный
> объект типа int*. Это так ? То есть в стеке создаётся переменная и туда
> помещается значение int*, так ? Если так, то почему я не могу взять её адрес ??
> Она же есть !
это временная переменная ‘выражения’ она живет до’;’ также как и временные объекты.
ссылочная константа если не ошибаюсь это единственный способ продлить жизнь временного объекта.
- Zefick
- Постоялец
PANDA
> Ты хочешь сказать, что это одно и то же?
Нет, это ты так решил.
> Может, ты лучше будешь давать советы по жабе?
А может ты не будешь писать посты с наездами, если не умеешь читать мысли?
- PANDA
- Постоялец
Zefick
Из твоего кода создается именно такое впечатление.
1 «вариант»
> int *p = a.GetMember1();
> int **pMember1 = &p;
2 «вариант»
> int **pMember2 = a.GetMember2();
Зачем давать советы, если сам не понимаешь указатели?
- Eugene
- Участник
PANDA
Все нормально. Два варианта для двух разных целей.
Если я захочу сделать что то вроде foo(int** out_ptr), то я, может быть, захочу изменить поле класса,
foo(pMember2);
bor(*pMember2);
а может и не захочу
if(!*pMember1) foo(pMember1);
bar(*pMember1);
Reference to ‘ ‘ is ambigous error in Xcode
I was working with a custom iOS framework project in Xcode.There I am getting a lot of errors mentioning «Reference to ‘ ‘ is ambigous».I am attaching the screenshot of errors.Please help me correcting this.
Создан 03 июл. 15 2015-07-03 05:53:29 haritha
It looks like you forgot to mention any «;» or «,» in the code line. or i can’t debug that’s why it looks like problem with if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) line. – Code Hunterr 06 июл. 15 2015-07-06 04:31:41
Click on the disclosure next to the error (in the Error navigator on the left). Make the navigator wide enough to show the full messages after you do. Post a screenshot of those messages. – rob mayoff 06 июл. 15 2015-07-06 04:52:40
try ‘Cmd+Shift+K’ – 0yeoj 06 июл. 15 2015-07-06 04:54:30
@robmayoff:Yes please check the screen shot – haritha 06 июл. 15 2015-07-06 05:09:26
Actually when I build this in latest iOS 8 sdks I am not getting any error.It is showing problems in sdks 6.1 and other lower versions.But I want to run this in sdks 6.1 itself – haritha 06 июл. 15 2015-07-06 05:12:53
5 ответов
Actually This error was cleared when I shift from iOS SDK 6.1 to 7.1(or any version higher that 6.1)
Создан 10 июл. 15 2015-07-10 05:00:35 haritha
i am having same ios SDK. and i import UIKit and CoreGraphicsframework the error is shown CGRectMinXEdge is ambiguous in MMDrawer class. what can i do? – ios developer 20 июл. 16 2016-07-20 13:09:09
The error message makes me think you have two declarations of the same library functions. All of those references are from UIKit . Check to make sure only one version of UIKit is referenced in your project (check the frameworks), and make sure any libraries you have included are linking the same UIKit version as the rest of the app.
Steps to fix from here:
- Clean the project
- Delete everything inside ‘
/Library/Developer/Xcode/DerivedData/ModuleCache/’ (the button inside the organizer window did not work for me)
Создан 06 июл. 15 2015-07-06 04:42:35 Jason
Adding more information to Jason’s answer.
The error message makes me think you have two declarations of the same library functions. All of those references are from UIKit
mostly this can be occurring because of the header files. As you can see all the errors indicates that it is quoting the enum values. Enum values will always be in the .h files. Normally the reference headers(.h files) will be present inside the frameworks. It is a common mistake that sometimes these header files will be buried some where in our code by any third party frameworks. So kindly check your third party libraries.
I did face this issue once and after searching everywhere i could not able to find the solution. The only thing solved my issue was
Opening a fresh project and importing my files into that project. Actually it really took me less than 10 minutes to move to a new project and immediately my xcode was happy. This is definitely worth a try.
Создан 06 июл. 15 2015-07-06 05:40:55 iPrabu
Why is this bug and your solution related to namespaces? – Amin Negm-Awad 08 июл. 15 2015-07-08 05:33:38
Clean your project and rebuild again.If it don’t work then create a new project
Создан 07 июл. 15 2015-07-07 04:05:14 haritha
Set value of Enable Module (C and objective-c) to No
Создан 20 янв. 17 2017-01-20 13:53:34 Mohit tomar
This doesn’t solve the problem. – Aanchal Chaurasia 27 окт. 17 2017-10-27 11:55:51
Двоичное дерево поиска
Задание. Построение и обработка двоичных деревьев поиска. Реализовать программу, выполняющую следующий набор операций с деревьями поиска:
поиск вершины с заданным значением ключа с выводом счетчика числа появлений данного ключа
добавление новой вершины в соответствии со значением ее ключа или увеличение счетчика числа появлений
построчный вывод дерева в наглядном виде с помощью обратно-симметричного обхода
вывод всех вершин в одну строку по порядку следования ключей с указанием для каждой вершины значения ее счетчика появлений
удаление вершины с заданным значением ключа
Выдает (в VS 2012) следующие ошибки:
Т. Е. он утв-ет что count не является однозначным и не определен
Причина: здесь, возможно, компилятором делается попытка интерпретировать «cout << count << . какая-то чушь» как стандартную шаблонную функцию std::count.
Ты сделал ТРИ ошибки, которые сделали ГОВНОМ этот исходный код:
1) Свалил пространство имен std в общую кучу, с легкой руки вычертив using namespace std;
2) НЕ указывал оператор :: перед обращением к глобальной переменной
3) НЕ удосужился отформатировать исходник, но очень круто выложил это в pastebin
Избавляемся от ошибки «This function or variable may be unsafe» в Visual Studio
Время чтения: 5 минут
Компилятор в Visual Studio сильно отличается от привычных большинству программистов GCC или CLANG, из-за чего при написании кода на C или C++ очень часто возникают неожиданные проблемы в виде ошибки использования стандартных функций, например, scanf, fopen, sscanf и тому подобным. Студия предлагает заменять функции на безопасные (повезёт, если нужно просто добавить _s к функции с ошибкой, но нередко в этих функциях идёт иной набор аргументов, нежели в обычной программе). Если вы не готовы с этим мириться, то этот пост для вас!
Давайте для начала создадим обычный консольный проект в Visual Studio и напишем простенькую программу, которая запрашивает ввод двух чисел, вводит их и затем выводит на экран.
Попробовав выполнить сборку проекта, обнаружим те самые ошибки.
Чтобы Visual Studio не тратила ваши нервы, сделаем следующее:
1. Выберем пункт «Проект» в верхнем меню
2. В открывшемся списке щёлкнем по «Свойства название_проекта»
3. В появившемся окне выберем Свойства конфигурации , C/C++ , Препроцессор
4. В строке Определения препроцессора допишем в самый конец строку ;_CRT_SECURE_NO_WARNINGS
6. Попробуем заново выполнить сборку проекта:
Ошибки исчезли, сборка прошла успешно и программа прекрасно работает! Теперь можно писать код как обычно, не переживая о необычном поведении Visual Studio!
Программист, сооснователь programforyou.ru, в постоянном поиске новых задач и алгоритмов
Языки программирования: C, C++, Pascal, C#
Студент МГУ им. М.В. Ломоносова
А Вы знаете, что мы пишем программы на C, C++, C#, Pascal и Python?
Так что если Вам нужно написать программу на C/C++, C#, Pascal или Python — мы с радостью поможем с этим!
В том числе мы занимаемся репетиторством по информатике и программированию, а также готовим к ОГЭ и ЕГЭ!
Почему именно мы?
- Более 1800 выполненных заказов;
- Более 170 отзывов;
- Качественное решение
- Короткие сроки и привлекательные цены
- Различные акции и скидки
Как с нами связаться?
- группа Вконтакте: vk.com/programforyou
- наша почта: order@programforyou.ru
Programforyou — позвольте нам писать код для вас и вы получите качественное решение в короткие сроки по привлекательной цене!
Ошибка C2653: . не является существующим классом
Я продолжаю получать ту же ошибку, когда я определенно создал «non-existent» класс RandomNumGuesser .
Я уже позаботился о том, чтобы включить ; после закрытия каждого класса >
Не знаю, что еще сказать.
Я мог бы использовать опытный глаз, потому что я не вижу никаких проблем.
Кроме того, в данный момент я использую Visual 2013. Были включены предварительно скомпилированные заголовки.
2 Ответа
У вас есть синтаксическая ошибка. Есть и другие проблемы: getCurrentGuess не является частью класса RandomNumGuesser (то же самое с другими методами в классе Guesser ). Я считаю, что журнал ошибок был сокращен в вопросе.
Вот как должен выглядеть cpp
RandomNumGuess не имеет функций-членов
Однако вы определяете их в исходном файле.
Может быть, они должны быть абстрактными виртуальными функциями?
Вы также не можете определить конструктор по умолчанию для NumberGuesser и RandomNumGuesser .
Похожие вопросы:
Это серьезно действует мне на нервы. Этот код работал просто отлично раньше, я перезапустил IDE (Visual Studio 2010), и теперь внезапно код выходит из строя на меня. Журнал ошибок огромен, и я.
Я пытаюсь сослаться на структуру из другого класса в своем коде, и это дает мне ошибку, говоря, что у меня есть проблема синтаксиса. #pragma once #include Definitions.h #include GV.h #include UI.h.
Общий вопрос об интеграции Realm с существующим проектом. Другой фреймворк у меня есть класс User , который имеет кучу свойств. Есть ли в любом случае с Realm, что я могу просто сохранить этот.
Когда я запускаю эту программу, она говорит, что в этом файле есть ошибка под названием error C2653: ‘Application’ : is not a class or namespace name #include MyForm.h using namespace std; int.
Я понимаю, что многие люди задавали этот вопрос, и есть похожие на Stack Overflow, но я не могу их понять. Я надеюсь, что кто-то скажет мне, почему это происходит, но и что происходит. Я кодировал.
Я загружаю jsoncpp на Github. И построил и установил его с мезоном и ниндзя. Но когда я включаю в свою программу, я получил ошибку: ‘PrecisionType’ не является классом или.
Добрый день. Я начал изучать c++ , и у меня есть и проблема компиляции моего проекта. Если вы найдете какой-нибудь неисправный код, я буду рад, если вы мне скажете. У меня есть следующие.
Мои предыдущие вопросы касались одного и того же проекта: Один и два . Нет необходимости читать их; просто знайте, что я пытаюсь использовать родной C++ SDK в проекте Visual C++. Это гораздо.
В Laravel4 я хочу использовать модель, которая представляет собой Event , поступающую из моей базы данных. Таким образом, в app/models у меня есть моя модель Event , которая расширяет Eloquent.
Я работаю над некоторым программным обеспечением для моделирования, написанным на C++. В настоящее время, когда я пытаюсь построить свой код, я получаю 9 ошибок компиляции, все жалуются на три.
C++ для людей
std::cout
Часто встречающиеся ошибки стадии компиляции
Очень часто начинающие программисты впадают в суеверный ужас, когда видят, что компилятор нашел в тексте программы ошибку, но не понимают, в чем она заключается.
А если помножить этот факт на незнание английского языка («чего там ему не нравится. ») и слабое владение синтаксисом C++ («хм, а может, тут нужна точка с запятой…»), то проблема принимает масштаб катастрофы.
Тот факт, что компилятор в силу своих ограниченных возможностей изо всех сил старается объяснить, что конкретно неверно, не спасает ситуацию. Как быть, если гуглить неохота, а спросить не у кого?
В этом посте на правах копипаста с последующим переводом, дополнениями и исправлениями приведу описание наиболее распространенных сообщений об ошибках и предупреждений компилятора. Неприятность кроется в том факте, что разные компиляторы ругаются на одинаковые ошибки по-разному, а некоторые даже не замечают то, что другие принимают за ошибку. Все зависит от совести разработчиков компилятора, даты его выпуска, и др.
В качестве компилятора возьмем g++, который, в частности, может использоваться в среде Code::Blocks. Версия gcc (куда входит g++) для ОС Windows зовется MinGW. По ходу я буду давать аналоги ошибок из лексикона русскоязычной Microsoft Visual C++.
Итак, частые ошибки:
undeclared identifier
doy.cpp: In function ‘int main()’:
doy.cpp:25: ‘DayOfYear’ undeclared (first use this function)
doy.cpp:25: (Each undeclared identifier is reported only once for each function it appears in.)
doy.cpp:25: parse error before ‘;’ token
2) Смысл
Использован идентификатор DayOfYear , но компилятор не нашел его объявления. Он не знает, что такое DayOfYear .
- Вы забыли включить какой-то заголовочный файл ( #include. )
- Вы где-то ошиблись в написании идентификатора (при объявлении или использовании)
- Вы вообще забыли, что эту переменную надо объявить
Попытавшись скомпилировать это в Microsoft Visual C++, вы увидите:
error C2065: DayOfYear: необъявленный идентификатор
cout undeclared
xyz.cpp: In function ‘int main()’:
xyz.cpp:6: ‘cout’ undeclared (first use this function)
xyz.cpp:6: (Each undeclared identifier is reported only once for each function it appears in.)
2) Смысл
Суперклассика. Без комментариев.
- Вы забыли включить
- Вы забыли написать using namespace std;
jump to case label
switch.cpp: In function ‘int main()’:
switch.cpp:14: jump to case label
switch.cpp:11: crosses initialization of ‘int y’
2) Смысл
Смысл туманен
3) Когда бывает
Вы попытались объявить и инициализировать переменную (объект, указатель и т.п.) в метке case оператора выбора switch. Правилами C++ это запрещено.
В Microsoft Visual C++ эта ошибка зовется
error C2360: пропуск инициализации ‘y’ из-за метки ‘case’
Выход: заключите операторы этого case’а в фигурные скобки .
multi-line string / unterminated string
using namespace std;
вызовет бурную реакцию компилятора:
string.cpp:7:12: warning: multi-line string literals are deprecated
string.cpp: In function ‘int main()’:
string.cpp:7: ‘so’ undeclared (first use this function)
string.cpp:7: (Each undeclared identifier is reported only once for each function it appears in.)
string.cpp:7: parse error before ‘Mary’
string.cpp:8:28: warning: multi-line string literals are deprecated
string.cpp:8:28: missing terminating » character
string.cpp:7:12: possible start of unterminated string literal
2) Смысл
Компилятор думает, что мы хотим создать строковую константу с содержащимся в ней переносом строки, что-то типа
что не поддерживается языком. Также делается предположение о том, что мы, возможно, забыли поставить кавычки в конце первой строки. Собственно, так оно и есть.
3) Когда бывает
Когда не соблюдается правильное количество и положение кавычек в строковых литералах. Надо быть внимательнее.
Microsoft Visual C++ со свойственной ему детской непосредственностью, отметит, что нельзя делать переносы в строках и возмутится, где точка с запятой:
error C2001: newline в константе
error C2146: синтаксическая ошибка: отсутствие «;» перед идентификатором «cout»
comparison between signed and unsigned integer expressions
xyz.cpp: In function ‘int main()’:
xyz.cpp:54: warning: comparison between signed and unsigned integer expressions
2) Смысл
Это — предупреждение компилятора, которое говорит о том, что мы пытаемся сравнить (==, и т.д.) целочисленное выражение (может принимать положительные, отрицательные значения и 0) и беззнаковое целочисленное выражение (может быть только положительным, либо 0).
3) Когда бывает
Собственно, тогда и бывает. Напомню, что тип int по умолчанию знаковый, а некоторые функции (например, vector::size() ) возвращают unsigned int .
К примеру, следующий на первый взгляд безобидный код вызовет описываемое предупреждение:
Следует помнить, что в памяти знаковые и беззнаковые типы имеют разные внутренние представления, поэтому надо быть чертовски осторожными с указателями.
В Microsoft Visual C++ предупреждение выглядит так:
suggest parentheses around assignment used as truth value
xyz.cpp: In function `int main()’:
xyz.cpp:54: warning: suggest parentheses around assignment used as truth value
2) Смысл
Тоже классика. Компилятор предполагает (и в 99% случаев прав), что вы по ошибке включили в скобки в качестве условия для if/while/for вместо условного выражения выражение присваивания.
3) Когда бывает
Чаще всего — в if ‘ах, когда вместо «==» используется «=»
if (length = maxLength)
if (length == maxLength)
Заминка в том, что это не ошибка, т.к. в скомпилированной программе (если мы проигнорируем предупреждение) выражение присваивания (которое возвращает значение правого аргумента) во всех случаях, кроме тех, когда оно вернет 0 , будет преобразовано к true .
Вопрос по плюсам (error C2102: ‘&’ requires l-value)
Привет.
Такой вопрос:
значит тут будет ошибка.. error C2102: ‘&’ requires l-value
Нашёл тут вроде как объяснение.. И там говорят про локальную переменную.. Что типа я реально возвращаю временный объект типа int*. Это так ? То есть в стеке создаётся переменная и туда помещается значение int*, так ? Если так, то почему я не могу взять её адрес ?? Она же есть !
- =A=L=X=
- Постоялец
Gladiator
> Что типа я реально возвращаю временный объект типа int*. Это так ? То есть в
> стеке создаётся переменная и туда помещается значение int*, так ?
> Если так, то
> почему я не могу взять её адрес ?? Она же есть !
Ну вообще то можешь, но уже в следующем операторе команды функции оно не будет иметь смысла и корректного адреса, так что правильно ругается.
- Genx
- Удалён
>То есть в стеке создаётся переменная и туда помещается значение int*, так ?
Не в стеке. По умолчанию результат функции помещается не на стек, а в регистр EAX процессора (если он влезает туда).
- laMer007
- Удалён
Gladiator
Вы делаете что-то странное и за последствия я не ручаюсь, но думаю во время учебы нужно заниматься странными вещами.
Чтобы скомпилировалось достаточно что-то вроде:
- Zefick
- Постоялец
upd: специальное дополнение: приведённые два варианта неравносзачны, неоднозначны и не-ещё-что-хотите, если вы считаете их по какой-то причине некорректными для непоставленной задач, если они оскорбляют ваши религиозные чувства, доставляют вам батхёрт потому что их написал явист или ещё каким-то образом нарушают ваш внутренний мир, то просьба в треде об этом больше не писать
- nes
- Постоялец
Zefick
Приведенные тобой варианты не однозначны, первый не корректный для данной задачи.
- Gladiator
- Постоялец
=A=L=X=
> Ну вообще то можешь, но уже в следующем операторе команды функции оно не будет
> иметь смысла и корректного адреса, так что правильно ругается.
Почему не будет ? Стековая переменная держится в памяти пока жива переменная.. А жива она до тех пор, пока не покинула блок в котором объявлена.
- Gladiator
- Постоялец
Не решаю конкретной задачи, чисто академический интерес
- Gladiator
- Постоялец
аа.. всё дошло.. типа я беру адрес временной переменной, которая уничтожается после операции присваивания..
- PANDA
- Постоялец
Zefick
> int **pMember1 = &p;
> int **pMember2 = a.GetMember2();
Ты хочешь сказать, что это одно и то же? Может, ты лучше будешь давать советы по жабе?
- susageP
- Постоялец
возможно прокатит как int*const & pMember = a.GetMember();
const продлевает жизнь временным объектам. возможно прокатит и с int.
Gladiator
> И там говорят про локальную переменную.. Что типа я реально возвращаю временный
> объект типа int*. Это так ? То есть в стеке создаётся переменная и туда
> помещается значение int*, так ? Если так, то почему я не могу взять её адрес ??
> Она же есть !
это временная переменная ‘выражения’ она живет до’;’ также как и временные объекты.
ссылочная константа если не ошибаюсь это единственный способ продлить жизнь временного объекта.
- Zefick
- Постоялец
PANDA
> Ты хочешь сказать, что это одно и то же?
Нет, это ты так решил.
> Может, ты лучше будешь давать советы по жабе?
А может ты не будешь писать посты с наездами, если не умеешь читать мысли?
- PANDA
- Постоялец
Zefick
Из твоего кода создается именно такое впечатление.
1 «вариант»
> int *p = a.GetMember1();
> int **pMember1 = &p;
2 «вариант»
> int **pMember2 = a.GetMember2();
Зачем давать советы, если сам не понимаешь указатели?
- Eugene
- Участник
PANDA
Все нормально. Два варианта для двух разных целей.
Если я захочу сделать что то вроде foo(int** out_ptr), то я, может быть, захочу изменить поле класса,
foo(pMember2);
bor(*pMember2);
а может и не захочу
if(!*pMember1) foo(pMember1);
bar(*pMember1);
Reference to ‘ ‘ is ambigous error in Xcode
I was working with a custom iOS framework project in Xcode.There I am getting a lot of errors mentioning «Reference to ‘ ‘ is ambigous».I am attaching the screenshot of errors.Please help me correcting this.
Создан 03 июл. 15 2015-07-03 05:53:29 haritha
It looks like you forgot to mention any «;» or «,» in the code line. or i can’t debug that’s why it looks like problem with if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) line. – Code Hunterr 06 июл. 15 2015-07-06 04:31:41
Click on the disclosure next to the error (in the Error navigator on the left). Make the navigator wide enough to show the full messages after you do. Post a screenshot of those messages. – rob mayoff 06 июл. 15 2015-07-06 04:52:40
try ‘Cmd+Shift+K’ – 0yeoj 06 июл. 15 2015-07-06 04:54:30
@robmayoff:Yes please check the screen shot – haritha 06 июл. 15 2015-07-06 05:09:26
Actually when I build this in latest iOS 8 sdks I am not getting any error.It is showing problems in sdks 6.1 and other lower versions.But I want to run this in sdks 6.1 itself – haritha 06 июл. 15 2015-07-06 05:12:53
5 ответов
Actually This error was cleared when I shift from iOS SDK 6.1 to 7.1(or any version higher that 6.1)
Создан 10 июл. 15 2015-07-10 05:00:35 haritha
i am having same ios SDK. and i import UIKit and CoreGraphicsframework the error is shown CGRectMinXEdge is ambiguous in MMDrawer class. what can i do? – ios developer 20 июл. 16 2016-07-20 13:09:09
The error message makes me think you have two declarations of the same library functions. All of those references are from UIKit . Check to make sure only one version of UIKit is referenced in your project (check the frameworks), and make sure any libraries you have included are linking the same UIKit version as the rest of the app.
Steps to fix from here:
- Clean the project
- Delete everything inside ‘
Создан 06 июл. 15 2015-07-06 04:42:35 Jason
Adding more information to Jason’s answer.
The error message makes me think you have two declarations of the same library functions. All of those references are from UIKit
mostly this can be occurring because of the header files. As you can see all the errors indicates that it is quoting the enum values. Enum values will always be in the .h files. Normally the reference headers(.h files) will be present inside the frameworks. It is a common mistake that sometimes these header files will be buried some where in our code by any third party frameworks. So kindly check your third party libraries.
I did face this issue once and after searching everywhere i could not able to find the solution. The only thing solved my issue was
Opening a fresh project and importing my files into that project. Actually it really took me less than 10 minutes to move to a new project and immediately my xcode was happy. This is definitely worth a try.
Создан 06 июл. 15 2015-07-06 05:40:55 iPrabu
Why is this bug and your solution related to namespaces? – Amin Negm-Awad 08 июл. 15 2015-07-08 05:33:38
Clean your project and rebuild again.If it don’t work then create a new project
Создан 07 июл. 15 2015-07-07 04:05:14 haritha
Set value of Enable Module (C and objective-c) to No
Создан 20 янв. 17 2017-01-20 13:53:34 Mohit tomar
This doesn’t solve the problem. – Aanchal Chaurasia 27 окт. 17 2017-10-27 11:55:51
Как исправить ошибку «cout не является однозначным»?
country::country(char* aname, double at_winter, double at_spring, double at_summer, double at_autumn) :
name(new char[strlen(aname) + 1])
strcpy_s(name, strlen(aname) + 1, aname);
t_winter = at_winter;
t_spring = at_spring;
t_summer = at_summer;
t_autumn = at_autumn;
>;
country::country(const country& COUNTRY) :
name(new char[strlen(COUNTRY.name) + 1])
strcpy_s(name, strlen(COUNTRY.name) + 1, COUNTRY.name);
t_winter = COUNTRY.t_winter;
t_spring = COUNTRY.t_spring;
t_summer = COUNTRY.t_summer;
t_autumn = COUNTRY.t_autumn;
>;
ostream& operator<<(ostream& Out, const country& COUNTRY)
Out << «nСТРАНА: » << COUNTRY.name << «nТЕМПЕРАТУРА ЗИМОЙ» << COUNTRY.t_winter << «nТЕМПЕРАТУРА ВЕСНОЙ» << COUNTRY.t_spring << «nТЕМПЕРАТУРА ЛЕТОМ» << COUNTRY.t_summer << «nТЕМПЕРАТУРА ОСЕНЬЮ » << COUNTRY.t_autumn;
istream& operator>>(istream& In, country& COUNTRY)
char TEMP[123];
In >> TEMP >> COUNTRY.t_winter >> COUNTRY.t_spring >> COUNTRY.t_summer >> COUNTRY.t_autumn;
delete[] COUNTRY.name;
COUNTRY.name = new char[strlen(TEMP) + 1];
strcpy_s(COUNTRY.name, strlen(TEMP) + 1, TEMP);
return In;
>;
country& country::operator=(const country& COUNTRY) if (this == &COUNTRY) return *this;
delete[] name;
name = new char[strlen(COUNTRY.name) + 1];
strcpy_s(name, strlen(COUNTRY.name) + 1, COUNTRY.name);
name = COUNTRY.name;
t_winter = COUNTRY.t_winter;
t_spring = COUNTRY.t_spring;
t_summer = COUNTRY.t_summer;
t_autumn = COUNTRY.t_autumn;
return *this;
>;
NewCountry::NewCountry() :
country()
polusharie = NULL;
>;
NewCountry::NewCountry(char* aname, double at_winter, double at_spring, double at_summer, double at_autumn, int apolusharie) :
country(aname,at_winter, at_spring, at_summer, at_autumn)
polusharie = apolusharie;
>;
NewCountry::NewCountry(const NewCountry& COUNTRY) :
country(COUNTRY)
polusharie = COUNTRY.polusharie;
>;
string NewCountry::sReturnpolusharie() if (polusharie == 1) return «северное»;
if (polusharie == 2) return «южное»;
if (polusharie == 3) return «по обе стороны экватора»;
return «. ОШИБКА:данные отсутствуют. «;
>;
ostream& operator<<(ostream& Out, const NewCountry& COUNTRY)
Out << «nСТРАНА: » << COUNTRY.name << «nТЕМПЕРАТУРА ЗИМОЙ» << COUNTRY.t_winter << «nТЕМПЕРАТУРА ВЕСНОЙ» << COUNTRY.t_spring << «nТЕМПЕРАТУРА ЛЕТОМ» << COUNTRY.t_summer << «nТЕМПЕРАТУРА ОСЕНЬЮ » << COUNTRY.t_autumn;
Out << «nРАСПОЛОЖЕНИЕ ОТНОСИТЕЛЬНО ЭКВАТОРА: «;
if (COUNTRY.polusharie == 1) Out << «СЕВЕРНОЕ»;
if (COUNTRY.polusharie == 2) Out << «ЮЖНОЕ»;
if (COUNTRY.polusharie == 3) Out << «ПО ОБЕ СТОРОНЫ ЭКВАТОРА»;
return Out;
>;
istream& operator>>(istream& In, NewCountry& COUNTRY)
char TEMP[123];
In >> TEMP >> COUNTRY.t_winter >> COUNTRY.t_spring >> COUNTRY.t_summer >> COUNTRY.t_autumn >> COUNTRY.polusharie;
delete[] COUNTRY.name;
COUNTRY.name = new char[strlen(TEMP) + 1];
strcpy_s(COUNTRY.name, strlen(TEMP) + 1, TEMP);
return In;
>;
NewCountry& NewCountry::operator=(const NewCountry& COUNTRY) if (this == &COUNTRY) return *this;
delete[] name;
name = new char[strlen(COUNTRY.name) + 1];
strcpy_s(name, strlen(COUNTRY.name) + 1, COUNTRY.name);
t_winter = COUNTRY.t_winter;
t_spring = COUNTRY.t_spring;
t_summer = COUNTRY.t_summer;
t_autumn = COUNTRY.t_autumn;
polusharie = COUNTRY.polusharie;
return *this;
>;
void main() setlocale(LC_ALL, «Russian»);
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int N;
double winter = lol[0].ReturnT_Winter;
double summer = lol[0].ReturnT_Summer;
NewCountry* lol;
cout << «КОЛИЧЕСТВО СТРАН: «;
cin >> N;
lol = new NewCountry[N];
cout << «Введите данныеnНазвание страны , температура зимой,весной и летом, в каком полушарии находится (1 — северное, 2 — южное, 3 — по обе стороны экватора ):nn»;
for ( int i = 0; i < N; i++) cin >> lol[i];
for ( int i = 0; i < N; i++)
if (winter < lol[i].ReturnT_Winter())
winter = lol[i].ReturnT_Winter();
if (summer > lol[i].ReturnT_Summer ())
summer = lol[i].ReturnT_Summer();
>
>;
cout << «nПроверка оператора =n»;
lol[0] = lol[1];
cout << lol[0] << endl;
cout << lol[1] << endl;
cout << «nПроверка конструктора копированияn»;
NewCountry Copy(lol[2]);
cout << Copy << endl;
cout << lol[2] << endl;
delete[] lol;
system(«pause»);
>;