Непонятки с шаблоном
От: Инженер  
Дата: 21.10.04 06:38
Оценка:
Столкнулся вот с таким примером:

#include <list>
#include <string>
std::list<std::string> g_RegEntries;

struct RegistratorClass
{
    template <class T>
    RegistratorClass(const T& stuff)
    {
        abrakadabra;
        g_RegEntries.push_back("Some entry");
    }
};

struct MyClass
{
    MyClass()
    {
        // some necessary initialization
    }
};

RegistratorClass reg_entry(MyClass());

using namespace std;

int main(int argc, char *argv[])
{
    std::list<std::string>::iterator It = g_RegEntries.begin();
    if( It == g_RegEntries.end() )
        printf("Wow! Why empty?");
    else
        printf(It->c_str());
    system("PAUSE");    
    
    return 0;
}


Что интересно код компилируется и выполняется.
Результат: "Wow! Why empty?"
Вопрос: Why empty?!
Re: Непонятки с шаблоном
От: elcste  
Дата: 21.10.04 06:55
Оценка: +1
Здравствуйте, Инженер, Вы писали:

И>Что интересно код компилируется и выполняется.


Этот код, разумеется, не компилируется. Вопрос же Ваш заключается, очевидно, в непонимании того, что
RegistratorClass reg_entry(MyClass());
— объявление функции reg_entry, принимающей указатель на функцию без параметров, возвращающую объект MyClass, и возвращающей объект RegistratorClass.
Re: Непонятки с шаблоном
От: Bell Россия  
Дата: 21.10.04 06:56
Оценка:
Здравствуйте, Инженер, Вы писали:

И>Вопрос: Why empty?!


VC6:
Some entry.

Что за компилятор? Все, что ты привел, находится в одной еденице трансляции?
Любите книгу — источник знаний (с) М.Горький
Re: Непонятки с шаблоном
От: PM  
Дата: 21.10.04 06:56
Оценка: +1
Здраствуйте, Инженер, Вы писали:

[]
> RegistratorClass reg_entry(MyClass()); // это объявление функции reg_entry а не глобальный объект!


Чтобы создать объект reg_entry надо писать так:
RegistratorClass reg_entry((MyClass()));


--
foobar2000 v0.8.3: Loreena McKennitt — Skellig [The Book of Secrets]
Re[2]: Непонятки с шаблоном
От: Инженер  
Дата: 21.10.04 06:58
Оценка:
Этот код компилируется как на VC.NET 2003 так и на gcc. За объявление функции спасибо!
Re[2]: Непонятки с шаблоном
От: Bell Россия  
Дата: 21.10.04 07:01
Оценка:
Здравствуйте, elcste, Вы писали:

E>Здравствуйте, Инженер, Вы писали:


И>>Что интересно код компилируется и выполняется.


E>Этот код, разумеется, не компилируется. Вопрос же Ваш заключается, очевидно, в непонимании того, что

E>
RegistratorClass reg_entry(MyClass());
— объявление функции reg_entry, принимающей указатель на функцию без параметров, возвращающую объект MyClass, и возвращающей объект RegistratorClass.


Это заблуждение. Данный код корректен — его прекрасно компилят Comeau, VC7.1, VC6
Любите книгу — источник знаний (с) М.Горький
Re[3]: Непонятки с шаблоном
От: korzhik Россия  
Дата: 21.10.04 07:05
Оценка:
Здравствуйте, Bell, Вы писали:

B>Это заблуждение. Данный код корректен — его прекрасно компилят Comeau, VC7.1, VC6


компилят то они его нормально, но код не работает как задумано.
У меня VC7.1 тоже решил что это объявление функции и я думаю он прав.
Re[4]: Непонятки с шаблоном
От: Bell Россия  
Дата: 21.10.04 07:11
Оценка:
Здравствуйте, korzhik, Вы писали:

K>компилят то они его нормально, но код не работает как задумано.

K>У меня VC7.1 тоже решил что это объявление функции и я думаю он прав.

Верно — это я заблудился. Здесь действительно имеет место быть объявление функции, однако тем не менее код этот вполне корректен, и утверждение "Этот код, разумеется, не компилируется" неверно (по крайне мере без указания компилятора).

ЗЫ
Мой VC6 посчитал конструкцию
RegistratorClass reg_entry(MyClass());

за определение объекта...
Любите книгу — источник знаний (с) М.Горький
Re[5]: Непонятки с шаблоном
От: Vamp Россия  
Дата: 21.10.04 07:13
Оценка: :)
B>ЗЫ
B>Мой VC6 посчитал конструкцию
B>
B>RegistratorClass reg_entry(MyClass());
B>

B>за определение объекта...

Да, ему это свойственно.
Да здравствует мыло душистое и веревка пушистая.
Re[3]: Непонятки с шаблоном
От: elcste  
Дата: 21.10.04 07:24
Оценка:
Здравствуйте, 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


P.S. Кстати, а что такое printf и system?
Re[5]: Непонятки с шаблоном
От: elcste  
Дата: 21.10.04 07:26
Оценка:
Здравствуйте, Bell, Вы писали:

B>Верно — это я заблудился. Здесь действительно имеет место быть объявление функции, однако тем не менее код этот вполне корректен, и утверждение "Этот код, разумеется, не компилируется" неверно (по крайне мере без указания компилятора).


Да, Вы правы. Следует сказать: этот код ill-formed.
Re[6]: Непонятки с шаблоном
От: Анатолий Широков СССР  
Дата: 21.10.04 07:27
Оценка: 1 (1)
E>Да, Вы правы. Следует сказать: этот код ill-formed.

Почему, этот код well-wormed, но делает не то, что от него ждут.
Re[4]: Непонятки с шаблоном
От: Bell Россия  
Дата: 21.10.04 07:34
Оценка:
Здравствуйте, 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.
Любите книгу — источник знаний (с) М.Горький
Re[5]: Непонятки с шаблоном
От: korzhik Россия  
Дата: 21.10.04 07:36
Оценка:
Здравствуйте, Bell, Вы писали:

E>>

"ComeauTest.c", line 10: error: identifier "abrakadabra" is undefined
E>> abrakadabra;
E>> ^


B>Эээ.. ну... нету слов

B>Я согласен конечно, что код примера должен быть чистым, просто я эту абру-кадабру сразу выкинул...

согласен, я тоже убрал abrakadabra, но что интересно VC7.1 компилит и с abrakadabra
Re[6]: Непонятки с шаблоном
От: Bell Россия  
Дата: 21.10.04 07:48
Оценка:
Здравствуйте, korzhik, Вы писали:

K>согласен, я тоже убрал abrakadabra, но что интересно VC7.1 компилит и с abrakadabra


Я пробовал на Dinkum Exam + Microsoft .NET 2003 C++ compiler — он заругался. (кстати VC7.1 и Microsoft .NET 2003 C++ compiler разве не одно и то же?)
Любите книгу — источник знаний (с) М.Горький
Re[7]: Непонятки с шаблоном
От: korzhik Россия  
Дата: 21.10.04 07:51
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, korzhik, Вы писали:


K>>согласен, я тоже убрал abrakadabra, но что интересно VC7.1 компилит и с abrakadabra


B>Я пробовал на Microsoft .NET 2003 C++ compiler — он заругался.

странно

>кстати VC7.1 и Microsoft .NET 2003 C++ compiler разве не одно и то же?

одно и тоже

версия cl.exe у меня 13.10.3077
Re[5]: Непонятки с шаблоном
От: elcste  
Дата: 21.10.04 07:52
Оценка:
Здравствуйте, Bell, Вы писали:

B>Эээ.. ну... нету слов

B>Я согласен конечно, что код примера должен быть чистым, просто я эту абру-кадабру сразу выкинул...

А я сразу же в объявление скобки добавил. Понятно ведь, о чем OP думал.

E>>P.S. Кстати, а что такое printf и system?

B>Насчет printf — это шутка?

То, что <list> и <string> не обязаны включать <stdio.h> и <stdlib.h>, это не шутка, это суровая реальность.
Re[8]: Непонятки с шаблоном
От: Bell Россия  
Дата: 21.10.04 08:04
Оценка:
Здравствуйте, 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 же такие вещи проверяет вне зависимости от того, инстанциируется ли шаблон метода, или нет.
Любите книгу — источник знаний (с) М.Горький
Re[7]: Непонятки с шаблоном
От: elcste  
Дата: 21.10.04 08:13
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

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 относится к одной из трех перечисленных групп?
Re[8]: Непонятки с шаблоном
От: Анатолий Широков СССР  
Дата: 21.10.04 09:23
Оценка: 1 (1)
Здравствуйте, elcste, Вы писали:

E>Здравствуйте, Анатолий Широков, Вы писали:


E>>>Да, Вы правы. Следует сказать: этот код ill-formed.

АШ>>Почему, этот код well-wormed, но делает не то, что от него ждут.

E>Полистал стандарт и заинтересовался... Давайте попробуем разобраться.

E>Считаете ли Вы, что abrakadabra относится к одной из трех перечисленных групп?

abrakadabra у меня на уровне препроцессирования ушла

Пользуясь случаем и Вы мне тогда ответьте:

А я сразу же в объявление скобки добавил. Понятно ведь, о чем OP думал.


Скобки Вы добавить догадались, а убрать abrakadabra нет?
Re[3]: Непонятки с шаблоном
От: Lorenzo_LAMAS  
Дата: 21.10.04 09:25
Оценка:
B>Это заблуждение. Данный код корректен — его прекрасно компилят Comeau, VC7.1, VC6

Ага. А что такое system, что без объявления используется? Он в <list> или в <string> по стандарту должен содержаться?
Of course, the code must be complete enough to compile and link.
Re[4]: Непонятки с шаблоном
От: Инженер  
Дата: 21.10.04 09:34
Оценка:
Моя ошибка. Надо было удалить при создании темы.
Это какая-то фишка gcc компилятора Dev-C++ среды. Кажется она не дает консольному окну автоматически закрываться после выполнения. Просто забудь про эту строку.
Re[5]: Непонятки с шаблоном
От: Lorenzo_LAMAS  
Дата: 21.10.04 09:44
Оценка:
Здравствуйте, Инженер, Вы писали:

И>Моя ошибка. Надо было удалить при создании темы.

И>Это какая-то фишка gcc компилятора Dev-C++ среды. Кажется она не дает консольному окну автоматически закрываться после выполнения. Просто забудь про эту строку.

Так мой не DEV-C++ g++ 3.2.3 тоже не стал ругаться, потому как кто-то из заголовков list или string содержит нужное включение
Of course, the code must be complete enough to compile and link.
Re[4]: Непонятки с шаблоном
От: Bell Россия  
Дата: 21.10.04 09:47
Оценка: +1
Здравствуйте, Lorenzo_LAMAS, Вы писали:

B>>Это заблуждение. Данный код корректен — его прекрасно компилят Comeau, VC7.1, VC6


L_L>Ага. А что такое system, что без объявления используется? Он в <list> или в <string> по стандарту должен содержаться?


Формально ты конечно прав, и мое утверждение про коррекетость кода неверно. Но вернемся к нашей проблеме: было ли в исходном вопросе хоть слово, связанное с этими самыми system и printf? Вызвало ли это ошибку при использовании самых популярных компиляторов? ИМХО данное обстоятельство в контексте заданного вопроса несущественно, и не заслуживает такого повышенного внимания. Тоже самое относится и к abracadabra.

ИМХО это называется "делать из мухи слона".
Любите книгу — источник знаний (с) М.Горький
Re[5]: Непонятки с шаблоном
От: Lorenzo_LAMAS  
Дата: 21.10.04 09:49
Оценка:
B>ИМХО это называется "делать из мухи слона".

Да, в общем-то. Просто elcste в свойственной ему манере очень кратко ответил (не компилируется) и в результате пришлось потом ему объяснять
Of course, the code must be complete enough to compile and link.
Re[9]: Непонятки с шаблоном
От: Lorenzo_LAMAS  
Дата: 21.10.04 09:59
Оценка:
B>Мне кажется, что Dinkum Exam использует что-то другое. Вот его сообщение об ошибке:

Можно ссылку на него?
Of course, the code must be complete enough to compile and link.
Re[10]: Непонятки с шаблоном
От: Bell Россия  
Дата: 21.10.04 10:04
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:


B>>Мне кажется, что Dinkum Exam использует что-то другое. Вот его сообщение об ошибке:


L_L>Можно ссылку на него?


Вот: http://dinkumware.com/exam/dinkumExam.aspx
Любите книгу — источник знаний (с) М.Горький
Re[9]: Непонятки с шаблоном
От: elcste  
Дата: 21.10.04 10:08
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

АШ>Пользуясь случаем и Вы мне тогда ответьте:

АШ>А я сразу же в объявление скобки добавил. Понятно ведь, о чем 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.
Было бы полезнее...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.