简单的嵌套类
Simple nested class
我有一个关于c++中嵌套类的初学者问题。互联网上有很多关于这个的信息,但我仍然不能让它正常工作而没有编译错误。我只是想从类a中的函数返回内部类B。
template<class T>
class A
{
public:
A();
class B
{
public:
B(){};
};
B getB();
};
template<class T>
A<T>::A(){}
template<class T>
B A<T>::getB{return B();}
当我这样做时,我得到错误"B没有命名类型"。我相信解决方案是使用typedef class A<T>::B b_class;
,但我仍然以同样的错误结束。
谢谢!
您需要更改一些东西:在函数定义中添加父类,用封闭类(A<T>::
)和typename
一起限定外部B
(需要,因为类型取决于a的类型),并更改返回到实际对象创建。
在这里,在固定源中列出:
template<class T>
typename A<T>::B A<T>::getB() {return B();}
//^----------------------------------------------typename
// ^---------------------------------------qualification
// ^---------------------parens
// ^---------c-tor call
template<class T>
B A<T>::getB{return B b;}
这里有三个问题:
声明开头的
B
没有命名A<T>::B
类型。您需要通过使用typename A<T>::B
或使用尾随返回类型来明确它,以便B
引用正确的名称。getB
之后没有()
您创建临时
B
的语法不正确,应该是B()
或B{}
这里是一个固定的版本:
template<class T>
auto A<T>::getB() -> B { return B{}; }
A
是模板的名称,因此A<T>
是(实例化的)类的名称。
因此,嵌套类的全名是A<T>::B
,但由于B
依赖于模板参数T
并且是一个类型,因此必须指定template A<T>::B
。
棘手的是,在A
的声明中,您可以通过使用B
名称来引用B
。您可以通过使用A
来引用A<T>
的实例化,使用所谓的注入类名。因此,在类声明内部,A
既可以引用模板,也可以引用类的实例化。
回答你的问题:
template<class T>
typename A<T>::B A<T>::getB()
{
B b;
return b;
}
请注意,返回类型在函数声明之外,因此需要使用完全限定名。
相关文章:
- 嵌套在类中时无法设置成员数据
- 无法访问嵌套类.类的使用无效
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 如何在C++中初始化嵌套类中的2个memeber
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 在C++中搜索嵌套多映射值
- 简单的C 嵌套以用于循环程序,以打印带有星星错误的正方形
- 简单逻辑解析器的嵌套循环
- 使用嵌套环以简单(对我来说很难)输出
- C 提升:简单的嵌套字典
- 嵌套锁和简单锁之间的区别
- 简单C++是嵌套布尔方法
- 简单嵌套"If else"语句
- C++ - 简单 - 嵌套,而循环永远不会终止
- 简单的嵌套循环问题.*形状*
- 简单的嵌套类
- 想要创建一个简单的嵌套结构
- 复制嵌套矢量的最简单方法是什么
- C++:不应用于简单嵌套if-then-else语句的条件
- 一个结构体的深度拷贝,它嵌入了许多简单的变量和一个嵌套结构体