为什么
class A;
template<typename T> class B
{
private:
A* a;
public:
B();
};
class A : public B<int>
{
private:
friend B<int>::B<int>();
int x;
};
template<typename T>
B<T>::B()
{
a = new A;
a->x = 5;
}
int main() { return 0; }结果
../src/main.cpp:15:错误:无效使用构造函数作为模板 ../src/main.cpp:15:注意:用‘B::B’代替‘B::类B’命名构造函数
但是,将friend B<int>::B<int>()更改为friend B<int>::B()将导致
../src/main.cpp:15: error: no‘void::B()’在类‘B’中声明的成员函数
当完全删除模板时
class A;
class B
{
private:
A* a;
public:
B();
};
class A : public B
{
private:
friend B::B();
int x;
};
B::B()
{
a = new A;
a->x = 5;
}
int main() { return 0; }编译和执行都很好--尽管我的IDE说朋友B::B()是无效语法?
发布于 2010-05-13 02:08:44
一个类型的人不起作用吗?例如:
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条),或者嵌套名称说明符后面指定的名称与嵌套名称说明符的最后一个组件中的标识符或简单模板id的模板名称相同,则该名称被考虑命名为C的构造函数。
听起来,嵌套名称说明符(Base)后面指定的名称(Base::)与嵌套名称说明符的最后一个组件中的标识符相同,因此这段代码确实命名了一个构造函数。
但我无法与12.1节class.ctor相一致
因为构造函数没有名称,所以在查找名称时找不到它们。
哦真的?3.4.3.1中的这种语言又起作用了吗?
在构造函数声明的声明符-id中,不能使用typedef名称作为类名。
这似乎很清楚,但第12.1节似乎只讨论了引入构造函数的声明,因为第1段排除了嵌套的名称说明符friend和using。如果它确实适用于朋友声明,它似乎也禁止friend Base::B();。
使用可选的函数说明符序列(7.1.2)、构造函数的类名和参数列表,使用特殊的声明器语法来声明或定义构造函数。
那些函数说明符是inline、virtual、explicit和构造函数,无论如何都不能是virtual。
https://stackoverflow.com/questions/2823485
复制相似问题