加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 具有嵌套类的模板类

发布时间:2020-12-16 07:06:17 所属栏目:百科 来源:网络整理
导读:1 #include iostream2 using namespace std;3 templatetypename T4 class Top {5 public:6 class Sub {7 protected:8 T age;9 };10 class Derived : public Sub {11 public:12 void printAge() {13 cout age endl;14 }15 }; 16 };17 int main()18 {19 return
1 #include <iostream>
2 using namespace std;
3 template<typename T>
4 class Top {
5 public:
6     class Sub {
7         protected:
8             T age;
9     };
10     class Derived : public Sub {
11         public:
12             void printAge() {
13                 cout << age << endl;
14             }
15     };  
16 };
17 int main()
18 {
19     return 0;
20 }

当我编译代码时,我收到以下错误:

test.cpp: In member function ‘void Top<T>::Derived::printAge()’:
test.cpp:13:25: error: ‘age’ was not declared in this scope
             cout << age << endl;

但如果它不是模板,那就没关系.
我很高兴收到你的答案.

解决方法

Derived中的age是模板内的名称.标准定义了两种名称:

> Dependent:依赖于模板参数但不依赖于模板参数的名称
在模板中声明.
>非依赖:不依赖于模板参数的名称,以及模板本身的名称和在其中声明的名称.

在线cout<<年龄<< endl,age是一个非依赖名称,应在模板定义的点处解析.此时,编译器仍然不知道年龄是多少,因为Top :: sub可以/稍后可以专用.因此它不会在基类中查找名称,而只是在封闭范围内.由于封闭范围内没有年龄,编译器会抱怨. 添加此 – >或者Top :: on age使其依赖,因此查找规则会发生变化.现在,在模板实例化时解决了年龄问题,编译器完全理解了基类,并且可以正确地解析名称.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读