id i: public: void f() { i.g()

Автор admin Понедельник, 18 мая 2009 11:32

id i: public: void f() { i.g(): } }: class Y { public: class id { public: void g() {} }: }: int mainO { X xy: xy.fO: } ///:- 192 Глава 5 • Шаблоны Определение шаблона предполагает, что в передаваемом ему классе Т должен содержаться некий вложенный идентификатор с именем id. Однако id также может быть статической переменной Т; в этом случае вы сможете напрямую выполнять операции с id, но не сможете «создать объект типа id». В приведенном примере идентификатор id интерпретируется как вложенный тип по отношению к Т. В случае класса Y идентификатор id действительно является вложенным типом, но без ключевого слова typename компилятор не будет знать об этом при компиляции X. Если компилятор, встречая идентификатор в шаблоне, может интерпретировать его как тип или как нечто иное, он всегда выбирает «нечто иное». Иначе говоря, компилятор будет считать, что идентификатор относится к объекту (включая переменные примитивных типов), перечисляемому типу или чему-нибудь в этом роде. Но он никогда не будет — а точнее, не сможет — интерпретировать его как тип. Раз компилятор по умолчанию предполагает, что потенциал


Комментарии закрыты.