Здравствуйте, elcste, Вы писали:
E>Здравствуйте, Инженер, Вы писали:
И>>Что интересно код компилируется и выполняется.
E>Этот код, разумеется, не компилируется. Вопрос же Ваш заключается, очевидно, в непонимании того, что E>
RegistratorClass reg_entry(MyClass());
— объявление функции reg_entry, принимающей указатель на функцию без параметров, возвращающую объект MyClass, и возвращающей объект RegistratorClass.
Это заблуждение. Данный код корректен — его прекрасно компилят Comeau, VC7.1, VC6
Здравствуйте, korzhik, Вы писали:
K>компилят то они его нормально, но код не работает как задумано. K>У меня VC7.1 тоже решил что это объявление функции и я думаю он прав.
Верно — это я заблудился. Здесь действительно имеет место быть объявление функции, однако тем не менее код этот вполне корректен, и утверждение "Этот код, разумеется, не компилируется" неверно (по крайне мере без указания компилятора).
Здравствуйте, Bell, Вы писали:
И>>>Что интересно код компилируется и выполняется. E>>Этот код, разумеется, не компилируется.
B>Это заблуждение. Данный код корректен — его прекрасно компилят Comeau,
"ComeauTest.c", line 10: error: identifier "abrakadabra" is undefined
abrakadabra;
^
B>VC7.1,
Да, похоже, действительно компилирует. Забавный компилятор.
B>VC6
D:\Work\Test\test.cpp(10) : error C2065: 'abrakadabra' : undeclared identifier
D:\Work\Test\test.cpp(23) : see reference to function template instantiation '__thiscall RegistratorClass::RegistratorClass(const struct MyClass &)' being compiled
Здравствуйте, Bell, Вы писали:
B>Верно — это я заблудился. Здесь действительно имеет место быть объявление функции, однако тем не менее код этот вполне корректен, и утверждение "Этот код, разумеется, не компилируется" неверно (по крайне мере без указания компилятора).
Да, Вы правы. Следует сказать: этот код ill-formed.
Здравствуйте, elcste, Вы писали:
B>>Это заблуждение. Данный код корректен — его прекрасно компилят Comeau,
E>
"ComeauTest.c", line 10: error: identifier "abrakadabra" is undefined
E> abrakadabra;
E> ^
Эээ.. ну... нету слов
Я согласен конечно, что код примера должен быть чистым, просто я эту абру-кадабру сразу выкинул...
E>P.S. Кстати, а что такое printf и system?
Насчет printf — это шутка?
system?
The system function passes command to the command interpreter,
which executes the string as an operating-system command.
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, korzhik, Вы писали:
K>>согласен, я тоже убрал abrakadabra, но что интересно VC7.1 компилит и с abrakadabra
B>Я пробовал на Microsoft .NET 2003 C++ compiler — он заругался.
странно
>кстати VC7.1 и Microsoft .NET 2003 C++ compiler разве не одно и то же?
одно и тоже
Здравствуйте, Bell, Вы писали:
B>Эээ.. ну... нету слов B>Я согласен конечно, что код примера должен быть чистым, просто я эту абру-кадабру сразу выкинул...
А я сразу же в объявление скобки добавил. Понятно ведь, о чем OP думал.
E>>P.S. Кстати, а что такое printf и system? B>Насчет printf — это шутка?
То, что <list> и <string> не обязаны включать <stdio.h> и <stdlib.h>, это не шутка, это суровая реальность.
Здравствуйте, korzhik, Вы писали:
>>кстати VC7.1 и Microsoft .NET 2003 C++ compiler разве не одно и то же? K>одно и тоже
Мне кажется, что Dinkum Exam использует что-то другое. Вот его сообщение об ошибке:
sourceFile.cpp
sourceFile.cpp(10) : error C2065: 'abrakadabra' : undeclared identifier
sourceFile.cpp(23) : see reference to function template instantiation 'RegistratorClass::RegistratorClass(const T &)' being compiled
with
[
T=MyClass
]
Судя по этому сообщению он, как и VC6, попытался создать объект, а для этого ему потребовалось инстанциировать конструктор. Тогда становится понятно, почему VC7.1 не ругался — он просто не инстанциировал конструктор, и поэтому "не заглядывал" в код шаблона...
Comeau же такие вещи проверяет вне зависимости от того, инстанциируется ли шаблон метода, или нет.
Здравствуйте, Анатолий Широков, Вы писали:
E>>Да, Вы правы. Следует сказать: этот код ill-formed. АШ>Почему, этот код well-wormed, но делает не то, что от него ждут.
Полистал стандарт и заинтересовался... Давайте попробуем разобраться.
14.6/1 Three kinds of names can be used within a template definition:
— The name of the template itself, and names declared within the template itself.
— Names dependent on a template-parameter (14.6.2).
— Names from scopes which are visible within the template definition.
Считаете ли Вы, что abrakadabra относится к одной из трех перечисленных групп?
Здравствуйте, elcste, Вы писали:
E>Здравствуйте, Анатолий Широков, Вы писали:
E>>>Да, Вы правы. Следует сказать: этот код ill-formed. АШ>>Почему, этот код well-wormed, но делает не то, что от него ждут.
E>Полистал стандарт и заинтересовался... Давайте попробуем разобраться. E>Считаете ли Вы, что abrakadabra относится к одной из трех перечисленных групп?
abrakadabra у меня на уровне препроцессирования ушла
Пользуясь случаем и Вы мне тогда ответьте:
А я сразу же в объявление скобки добавил. Понятно ведь, о чем OP думал.
Скобки Вы добавить догадались, а убрать abrakadabra нет?
Моя ошибка. Надо было удалить при создании темы.
Это какая-то фишка gcc компилятора Dev-C++ среды. Кажется она не дает консольному окну автоматически закрываться после выполнения. Просто забудь про эту строку.
Здравствуйте, Инженер, Вы писали:
И>Моя ошибка. Надо было удалить при создании темы. И>Это какая-то фишка gcc компилятора Dev-C++ среды. Кажется она не дает консольному окну автоматически закрываться после выполнения. Просто забудь про эту строку.
Так мой не DEV-C++ g++ 3.2.3 тоже не стал ругаться, потому как кто-то из заголовков list или string содержит нужное включение
Of course, the code must be complete enough to compile and link.
Здравствуйте, Lorenzo_LAMAS, Вы писали:
B>>Это заблуждение. Данный код корректен — его прекрасно компилят Comeau, VC7.1, VC6
L_L>Ага. А что такое system, что без объявления используется? Он в <list> или в <string> по стандарту должен содержаться?
Формально ты конечно прав, и мое утверждение про коррекетость кода неверно. Но вернемся к нашей проблеме: было ли в исходном вопросе хоть слово, связанное с этими самыми system и printf? Вызвало ли это ошибку при использовании самых популярных компиляторов? ИМХО данное обстоятельство в контексте заданного вопроса несущественно, и не заслуживает такого повышенного внимания. Тоже самое относится и к abracadabra.
Здравствуйте, Анатолий Широков, Вы писали:
АШ>Пользуясь случаем и Вы мне тогда ответьте:
АШ>А я сразу же в объявление скобки добавил. Понятно ведь, о чем OP думал.
АШ>Скобки Вы добавить догадались, а убрать abrakadabra нет?
Объявление функции вместо определения переменной — типичная ошибка, с ней все было очевидно. А вот abrakadabra меня очень заинтересовала в свете слов OP о том, что код транслируется. Потому в этом месте я понял OP буквально. И, как выяснилось, оказался прав: этот код действительно компилируется VC7.1.
Как я понимаю, обсуждать содержательную сторону вопроса (ill-formed ли эта программа или содержит undefined behavior, требуется ли диагностика, правильно ли действует VC7.1 и т.п.) Вы не хотите. Оно, наверное, и к лучшему. Рабочий день у меня уже закончился, и сил читать стандарт нет.
Re[8]: Непонятки с шаблоном
От:
Аноним
Дата:
21.10.04 10:11
Оценка:
Здравствуйте, elcste, Вы писали:
E>Здравствуйте, Анатолий Широков, Вы писали:
E>>>Да, Вы правы. Следует сказать: этот код ill-formed. АШ>>Почему, этот код well-wormed, но делает не то, что от него ждут.
E>Полистал стандарт и заинтересовался... Давайте попробуем разобраться. E>
14.6/1 Three kinds of names can be used within a template definition:
E>- The name of the template itself, and names declared within the template itself.
E>- Names dependent on a template-parameter (14.6.2).
E>- Names from scopes which are visible within the template definition.
E>Считаете ли Вы, что abrakadabra относится к одной из трех перечисленных групп?
По поводу компиляторов...
Вообще, с проблемой двоякой трактовки описания RegistratorClass reg_entry(MyClass());
мы столкнулись, когда переносили код с VS.2002 на VS.2003
В VS.2002 код компилировался и исполняся так, как и было задумано его создателями, а именно как создание объекта. А вот в VS.2003 уже как прототип функции (что, конечно, отвечает стандарту).
Обидно, что компилятор даже не выдал warning-а в режиме /W4.
Было бы полезнее...