136 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,894
1

byte - неоднозначный символ (С++17)

11.03.2021, 13:26. Показов 9204. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте,

Возникла такая проблема, компилирую код, как С++17(нужен std::filesystem), и тут возникает проблема:
C++
1
byte:неоднозначный символ
И возникает он в таких файлах, как:
C++
1
2
3
4
5
oaidl.h
objiidl.h
wtypes.h
rpcndr.h
//итд итп
Эти файлы похоже включены в Windows.h, потому что если убрать Windows.h - то все работает.

К примеру в файле rpcndr.h ошибка возникает вот в этой строчке:
C++
1
typedef byte cs_byte;

Я так грубо понял, что в С++17 добавилось, ключевое или резервное слово "byte"(но это не точно) и оно конфликтует с таким же именем где то в Windows.h.

На MSDNе написано:
Компилятор не может определить, на какой символ вы ссылаетесь. В области видимости находится более одного символа с указанным именем. См. примечания, следующие за сообщением об ошибке для расположений файлов и объявлений, обнаруженных компилятором для неоднозначного символа. Чтобы устранить эту проблему, можно полностью уточнить неоднозначный символ, используя его пространство имен, например std::byte или ::byte .
Но, как я это сделаю ? Я ж не использую этот byte, это где же в глубинах подключаемых внешних не моих файлов.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.03.2021, 13:26
Ответы с готовыми решениями:

Ошибка C2872 count: неоднозначный символ
В чем проблема? Ошибка C2872 count: неоднозначный символ #include <iostream>...

Error C2872: Keyboard: неоднозначный символ
Недавно начал изучать и при написании игры столкнулся с такой проблемой. "error C2872: Keyboard:...

"error C2872: неоднозначный символ" при переменной count
В общем вчера взялся изучать C++ по книге "C++ Базовый курс, 3 издание" Г. Шилдта. И тут такая...

Ошибки компиляции: "Неоднозначный символ".
#include "stdafx.h" #include <iostream> #include <string.h> using namespace System; using...

15
Модератор
Эксперт С++
13706 / 10909 / 6473
Регистрация: 18.12.2011
Сообщений: 29,125
11.03.2021, 13:37 2
Лучший ответ Сообщение было отмечено Optimus11 как решение

Решение

А если убрать
C++
1
#using namespace std
???????
Возможно, у Вас неправильно подключен пакет sdk:
byte - неоднозначный символ (С++17)

Попробуйте тут поменять версию.
1
136 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,894
11.03.2021, 13:49  [ТС] 3
Цитата Сообщение от zss Посмотреть сообщение
А если убрать
C++
1
#using namespace std
???????
Возможно, у Вас неправильно подключен пакет sdk:
Вложение 1233876
Попробуйте тут поменять версию.
Изменение SDK не помогает.

Теоретически убирание using namespace std не должно помочь:
-Я замучаюсь каждой переменной std:: приписывать
-У меня в проекте нет слово byte, которому я бы мог приписать std::
-если в свойствах проекта поставить C++14 - ошибка исчезает.


Может быть такое, что это еще может быть из за подключенной zlib библиотеки ? Ну да же, если так, как это победить не понятно.
0
фрилансер
5846 / 5375 / 1103
Регистрация: 11.10.2019
Сообщений: 14,366
11.03.2021, 13:55 4
Лучший ответ Сообщение было отмечено Optimus11 как решение

Решение

Цитата Сообщение от Optimus11 Посмотреть сообщение
Я замучаюсь каждой переменной std:: приписывать
я до сих пор не замучался )

Добавлено через 1 минуту
Цитата Сообщение от Optimus11 Посмотреть сообщение
using namespace std
а вот с этим геморрой и головная боль обеспечены

Добавлено через 44 секунды
Цитата Сообщение от Optimus11 Посмотреть сообщение
У меня в проекте нет слово byte
так оно есть в упомянутых выше файлах
1
136 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,894
11.03.2021, 14:30  [ТС] 5
Цитата Сообщение от zss Посмотреть сообщение
А если убрать
C++
1
#using namespace std
???????
Возможно, у Вас неправильно подключен пакет sdk:
Вложение 1233876
Попробуйте тут поменять версию.
В общем, не знаю в итоге какой там byte c каким пересекается, но поставил #include "Windows.h" над всеми инклудами, ошибка ушла.

Но теперь, я боюсь, что вся это история может потом привести к каковому нибудь неправильному поведению работы кода.
0
Just Do It!
4027 / 2421 / 640
Регистрация: 23.09.2014
Сообщений: 7,792
Записей в блоге: 2
11.03.2021, 14:42 6
Цитата Сообщение от Optimus11 Посмотреть сообщение
-Я замучаюсь каждой переменной std:: приписывать
походу крестоизобретатели зря старались:
а ведь можно спрятать весь <windows.h> в своём пространстве имён,
которое не будет пересекаться, а значит и мешать любым другим библиотекам,
в том числе и стандартным:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <filesystem>
 
namespace win
{   
    #include <windows.h>
    typedef byte cs_byte;
};
 
using std::byte;
 
int main()
{   
    win::cs_byte b = 123;
    std::cout << b << '\n';
    
    ///----------------------------|
    /// Здесь std::byte            |
    ///----------------------------:
    byte bb = (byte)b;
    std::cout << (char)bb << "\n\n";
 
    for(auto &file : std::filesystem::recursive_directory_iterator("./"))
    {   std::cout << file.path() << '\n';
    }
}
2
136 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,894
11.03.2021, 14:56  [ТС] 7
Цитата Сообщение от zss Посмотреть сообщение
А если убрать
C++
1
#using namespace std
Цитата Сообщение от Алексей1153 Посмотреть сообщение
using namespace std
а вот с этим геморрой и головная боль обеспечены
В общем да, проблема в этом!

Видимо, нужно прекращать использовать этот using. Но так неудобно будет.
0
фрилансер
5846 / 5375 / 1103
Регистрация: 11.10.2019
Сообщений: 14,366
11.03.2021, 15:07 8
Цитата Сообщение от Optimus11 Посмотреть сообщение
Но теперь, я боюсь, что вся это история может потом привести к каковому нибудь неправильному поведению работы кода
запросто )

Цитата Сообщение от XLAT Посмотреть сообщение
а ведь можно спрятать весь <windows.h> в своём пространстве имён,
только дефайны всё равно будут торчать, а их там дофига
а если в таком дефайне будет упоминание чего-то апишного, то ещё и не соберётся, так как внутри макроса не будет win::

Цитата Сообщение от Optimus11 Посмотреть сообщение
Но так неудобно будет.
уверяю, что даже не заметишь разницы в использовании
0
Just Do It!
4027 / 2421 / 640
Регистрация: 23.09.2014
Сообщений: 7,792
Записей в блоге: 2
11.03.2021, 15:24 9
Цитата Сообщение от Алексей1153 Посмотреть сообщение
только дефайны всё равно будут торчать, а их там дофига
ага, никогда не было и снова опять:
осталось научиться не смешивать сишный код с крестокодом,
или научиться смешивать их правильно.

обозначенная вами проблема напоминает мне использование в одной функции одновременно
и std::string и strlen(..),
такое нередко можно увидеть в этом разделе форума.

всё это можно элементарно разрулить.
0
фрилансер
5846 / 5375 / 1103
Регистрация: 11.10.2019
Сообщений: 14,366
11.03.2021, 15:45 10
XLAT, но лучше не допускать. Я так щитаю
1
Just Do It!
4027 / 2421 / 640
Регистрация: 23.09.2014
Сообщений: 7,792
Записей в блоге: 2
11.03.2021, 16:55 11
Цитата Сообщение от Алексей1153 Посмотреть сообщение
Я так щитаю
да не вопрос.

в данном случае возможно будет достаточно, просто добавить в свой "цикл разработки"
термин "апи-зависимый модуль" ...


Добавлено через 8 секунд
Цитата Сообщение от Алексей1153 Посмотреть сообщение
Я так щитаю
да не вопрос.

в данном случае возможно будет достаточно, просто добавить в свой "цикл разработки"
термин "апи-зависимый модуль" ...
0
Эксперт С++
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
11.03.2021, 18:06 12
Цитата Сообщение от XLAT Посмотреть сообщение
namespace win
{  
    #include <windows.h>

жессть.

Цитата Сообщение от Optimus11 Посмотреть сообщение
Теоретически убирание using namespace std не должно помочь:
любители глобального #using namespace std должны страдать.

Цитата Сообщение от Optimus11 Посмотреть сообщение
если убрать Windows.h
грамотные люди никогда не подключают ос-специфичные заголовки глобально.
Windows.h должен подключаться только по необходимости, и только в спп.
2
136 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,894
11.03.2021, 22:45  [ТС] 13
Цитата Сообщение от Алексей1153 Посмотреть сообщение
using namespace std;
а вот с этим геморрой и головная боль обеспечены
Подскажите, есть ли какие нибудь реальные минусы, если использовать define`ы таким образом?

C++
1
2
3
4
5
6
7
8
9
10
11
12
define.h
 
//---------------------------------------------------------------
#define cout std::cout
#define endl std::endl
#define vector std::vector
#define string std::string
#define wstring std::wstring
#define ofstream std::ofstream
#define hex std::hex
//итд итп
//---------------------------------------------------------------
C++
1
2
3
4
5
6
#include "define.h"
 
in main()
{
cout<<"Hello"<<endl;
}
0
фрилансер
5846 / 5375 / 1103
Регистрация: 11.10.2019
Сообщений: 14,366
11.03.2021, 22:46 14
Optimus11,

достаточно такого, остальное - лучше не лениться
C++
1
2
using std::cin;
using std::cout;
а дефайнами старайся не пользоваться вообще
1
Эксперт С++
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
11.03.2021, 22:53 15
Цитата Сообщение от Optimus11 Посмотреть сообщение
есть ли какие нибудь реальные минусы, если использовать define`ы таким образом?
Цитата Сообщение от Optimus11 Посмотреть сообщение
#define cout std::cout
так вообще нельзя делать, потому что это противоречит правилам языка.
нельзя переопределять ключевые слова, или стандартные идентификаторы.
в противном случае поведение не определено.
1
DrOffset
12.03.2021, 00:40     byte - неоднозначный символ (С++17)
  #16

Не по теме:

Цитата Сообщение от Optimus11 Посмотреть сообщение
#define cout std::cout
Уже где-то я это говорил, но что за странная тяга самым страшным и спорным решениям? Вам реально настолько пофиг как у вас все работает, лишь бы было, да? :)

В таких ситуациях обычно желается, чтобы врачи виновника лечили так же, как он пишет код - самыми страшными и спорными методами, какие только он сможет придумать. А оправдывать это все тем, что сразу-то пациент не умрет от этого.
Но я вместо этого побольше ответственности за то, что вы делаете, пожелаю.

0
12.03.2021, 00:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.03.2021, 00:40
Помогаю со студенческими работами здесь

Нельзя преобразовать тип function(a: byte;b: byte): byte к integer (Списки)
Создать список из целых чисел.Поменять в списке местами максимальный и минимальный элементы...

'utf-8' codec can't decode byte 0xff in position 0: invalid start byte
Работаю с библиотеками PIL и telebot В чем может быть проблема ? Ошибка - 'utf-8' codec can't...

UnicodeDecodeError: 'utf8' codec can't decode byte 0x80 - invalid start byte
Добрый день При вызове скрипта вылетает такая ошибка: &quot;UnicodeDecodeError: 'utf8' codec can't...

Перевести строку, содержащую данные массива байт (byte[]) в byte[]
Приветствую. Есть такая строка - &quot;&quot; Как её перевести в массив байт? 1. Допустим, что...

Invalid byte 1 of 1-byte UTF-8 sequence - ошибка (Intellij idea)
Есть небольшой проект, точнее, только зачаток, запускается нормально, но при сборке в jar ругается,...

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte
Всем доброе время суток. Решил сделать учебный проект. Сделал всё работало, потом дописал код и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru