Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
sergestus
77 / 77 / 23
Регистрация: 26.10.2011
Сообщений: 220
Завершенные тесты: 1
#1

Странное поведение транслятора - C++

26.10.2011, 10:33. Просмотров 460. Ответов 5
Метки нет (Все метки)

В следуюшем примере код компилируется нормально, но объект класса b не содается (пробывал на Visual studio 10 и на Borland builder 5), что бы это могло значить?

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
struct a
{
public:
    a(){}
};
 
 
class b
{
public:
    b(){} 
    b(a a_)
    {
        printf("!!!");
    }
};
 
 
int main(int argc, char* argv[])
{
    b b_(a()); // compiles, but doesn't create a code for this string ???
     
    return 0;
}
 Комментарий модератора 
Используйте теги форматирования кода
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.10.2011, 10:33
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Странное поведение транслятора (C++):

Странное поведение - C++
Здравствуйте еще раз :) Теперь возникла другая непонятка. Есть класс StringParser, объекты которого умеют разбивать строку на подстроки,...

Странное поведение new - C++
Объясните почему оператор new выделяет неверное количество памяти? # include <iostream> using namespace std; char* interpitator( int...

Странное поведение указателя - C++
#include <iostream> #include <cstring> int main(){ char line1="hello world!"; char line2="hell word!"; int...

Странное поведение cin - C++
Есть класс, в нем есть два текстовых private члена, friend-оператор>> и friend-функция getline для записи в эти члены. Но когда в main.cpp...

Странное поведение wstring - C++
Всем привет! Ребята, не могу понять такую ситуацию. Вставляю в wstring строку в позицию 0 таким образом ...

Странное поведение строки - C++
Есть класс со связным списком(в связных списках символы)(файл1). Перегружаю оператор сложения для объектов этих классов так, чтобы оператор...

5
HighPredator
5645 / 1962 / 373
Регистрация: 10.12.2010
Сообщений: 5,687
Записей в блоге: 3
26.10.2011, 12:11 #2
Если вы пытались откомпилировать сие в VS, то компилятор навреняка выдал вам warning c4930, говорящий о том, что он рассматривает конструкцию b b_(a()); как прототип функции, поскольку фактическим параметром выступает анонимный класс (не имеет имени). Соответственно, нет инстанцированного объекта в виде параметра.
Варианты борьбы:
1) создать промежуточную переменную
C++
1
2
a temp;
b b_(k);
2) согласно стандарту заключить в дополнительные скобки.
C++
1
b b_((a()));
1
sergestus
77 / 77 / 23
Регистрация: 26.10.2011
Сообщений: 220
Завершенные тесты: 1
27.10.2011, 16:37  [ТС] #3
>>Если вы пытались откомпилировать сие в VS, то компилятор навреняка выдал вам warning c4930, говорящий о том, что он рассматривает конструкцию b b_(a()); как прототип функции, поскольку фактическим параметром выступает анонимный класс (не имеет имени). Соответственно, нет инстанцированного объекта в виде параметра.

Вы совершенно правы, предупрежднние выдается, просто я не обратил внимания. Данная конструкция появилась случайно и я просто решил разобраться в чем проблема. Компилятор действительно воспринимает строку как прототип функции, вот только почему он интерпретирует a() как а (*)()?
0
HighPredator
5645 / 1962 / 373
Регистрация: 10.12.2010
Сообщений: 5,687
Записей в блоге: 3
27.10.2011, 19:48 #4
Цитата Сообщение от sergestus Посмотреть сообщение
только почему он интерпретирует a() как а (*)()?
А что-ж это по-вашему?

Добавлено через 1 минуту
У вас же анонимный вызов.
0
dimcoder
Полярный
467 / 440 / 68
Регистрация: 11.09.2011
Сообщений: 1,142
27.10.2011, 19:56 #5
Извиняюсь за оффтоп. Тему перепутал
0
sergestus
77 / 77 / 23
Регистрация: 26.10.2011
Сообщений: 220
Завершенные тесты: 1
28.10.2011, 11:22  [ТС] #6
Цитата Сообщение от Predator_2004 Посмотреть сообщение
А что-ж это по-вашему?

Добавлено через 1 минуту
У вас же анонимный вызов.
Мне тут подсказали, что компилятор интерпретирует а() как описание функции без имени (потому, что в прототипе функции параметры могут стоять без имени). Хотя и это еще не все, кроме этого копилятор дополнительно преобразует функцию в указатель на функцию... в итоге и получается а (*)().
0
28.10.2011, 11:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2011, 11:22
Привет! Вот еще темы с ответами:

Странное поведение компилятора - C++
Всем привет! Я конечно понимаю что нужно выкладывать минимальный код повторяющий мою проблему но он будет достаточно грамосток т.к. в...

Странное поведение getline - C++
В программе в двух местах используеться getline. В первом случае все супер : string ownerName; getline (cin, ownerName); А во...

Странное поведение указателя - C++
Здравствуйте, наткнулся на непонятное мне поведение указателя или точнее менеджера памяти. Есть код: #include <iostream> #include...

Странное поведение программы - C++
Перечитываю Герберт Шилдт: С++ базовый курс. Простая программа: #include <iostream> using namespace std; int main() { ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru