c++ - 模板 C++ 中的范围问题

标签 c++ templates

这个程序有范围问题吗?

#include<iostream>

using namespace std;

template<class Type>
class Base
{
   public:
   Type member;
   Base(Type param): member(param){

   }
};

template<class Type>
class Derived: public Base<Type>
{
    public:               
    Derived(Type param):Base<Type>(param){
     //                       ^
     //                       |_______  Not writing Type here gives error, why?
    }
    void display()
    {
        cout << member; /** ERROR HERE **/
    }
};

int main()
{
   Derived<int> p(5);
   p.display();
   return 0;
}

我得到错误 'member' was not declared in this scope。如何解决问题?

最佳答案

您的问题有点令人困惑。一开始我以为你问的是base<Type>在成员初始化列表中,那么我以为你问的是访问 member ,然后回到第一个...现在我想你是在问两个问题,所以我会回答两个问题。


Not writing Type here gives error, why?

当您使用类模板的名称 ( my_class_templ ) 时,它指的是 模板,它不是类型。为了将其用作类型,您需要提供模板参数( my_class_templ<int>my_class_templ<T> )。因此,无论何时需要类型名称(包括初始化列表中的基类名称),您都需要提供模板参数。

对于类模板定义中的类模板名称,您可以省略模板参数列表。例如,复制构造函数可以声明为

 my_class_templ(const my_class_templ& rhs);

代替

 my_class_templ<T>(const my_class_templ<T>& rhs);

这只是一个小语法糖,可以让您减少输入。

但是,在类模板定义之外,您需要明确拼出所有模板参数。对于派生类也是如此:

my_dervied_class_templ(const my_derived_class_templ& rhs)
 : my_class_templ<T>(rhs)                          // need to spell out <T> here
{
}

I get error 'member' was not declared in this scope. How to fix the problems?

当编译器第一次遇到您的模板时,只有它的定义,编译器还没有看到任何实例化。编译器不知道在实例化时,模板在范围内是否有特殊化。但是,您可以将模板专门用于 Base<T>::member指代其他事物或不完全定义。 (比如,特化 Base<void> 没有数据成员。)因此,编译器不得推测 Base 的成员。 .因此,它们不会在 Derived 中查找。 .

这样做的结果是,如果您需要引用 Base 的其中一位成员, 你需要告诉编译器你期望一个 Base<T>有这样的成员。这是通过完全限定其名称来完成的:Base<Type>::member .

关于c++ - 模板 C++ 中的范围问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3829040/

相关文章:

c++ - 在 jemalloc 中获取每个内存分配的 bin 大小

c++ - 创建大量对象 C++

c++ - 在使用 Clang 编译 CRTP Singleton 时,如何解决声称缺少 "explicit instantiation declaration"的问题?

c++ - 模板化函数的C++模板子类参数

c++ - 带模板的 N 维嵌套元循环

c++ - 模板的多态使用

c++ sort 会崩溃,而 stable_sort 不会,但两者都不起作用

c++ - 超出范围后在 Lambda 中设置共享指针

c++ - 为什么我不能使用作为模板类的父类的变量?

C++模板代码顺序解析/CRTP