Не помогает ли typedef? например,
class A : public B<int>
{
typedef B<int> Base;
friend Base::Base();
int x;
};
РЕДАКТИРОВАТЬ: Проект окончательного комитета для C ++ 0x включает следующий язык в разделе 3.4.3.1 [ class.qual ]:
В поиске, в котором конструктор является приемлемым результатом поиска, а спецификатор вложенного имени назначает класс C : если имя, указанное после вложенного спецификатор имени при поиске в C является именем введенного класса C (пункт 9), или если имя указано после вложенного -name-спецификатор совпадает с идентификатором или simple-template-id * template-name в последнем компоненте спецификатор вложенного имени , вместо этого имя считается именем конструктора класса C .
Похоже, имя (Base
), указанное после вложенного имени-спецификатора (Base::
), совпадает с идентификатором в последнем компоненте nested-name-спецификатор , поэтому этот код называет конструктор.
Но я не могу согласовать это с разделом 12.1 [ class.ctor ]:
Поскольку у конструкторов нет имен, они никогда не обнаруживаются при поиске имен
О, правда? Как этот язык в 3.4.3.1 снова работает?
A typedef-name не должно использоваться в качестве имя-класса в идентификатор объявления для объявления конструктора.
Это кажется довольно ясным, за исключением того, что раздел 12.1, по-видимому, обсуждает только вводное объявление конструктора, поскольку параграф 1 исключает спецификатор вложенного имени , friend
и using
. Если это действительно относится к объявлениям о друзьях, оно также запрещает friend Base::B();
Специальный синтаксис объявления, использующий необязательную последовательность спецификаторов функций (7.1.2), за которыми следует имя класса конструктора, за которым следует список параметров, используется для объявления или определения конструктора.
Эти спецификаторы функций являются inline
, virtual
, explicit
, а конструкторы не могут быть virtual
в любом случае.