Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 以子类作为模板参数的继承类_C++_Templates_Inheritance - Fatal编程技术网

C++ 以子类作为模板参数的继承类

C++ 以子类作为模板参数的继承类,c++,templates,inheritance,C++,Templates,Inheritance,可以用子类作为模板参数继承类吗 template<typename T> struct A{ T t; }; struct B:A<B>{ unsigned u; }; int main(){ B b; } 模板 结构A{ T; }; 结构B:A{ 未签名的u; }; int main(){ B B; } 是的,你能做到 您的问题似乎是错误“A::t”的类型不完整。例如,见 如果你 在A之前声明B,并且 在结构a中使用指针,它工作得很好 structb

可以用子类作为模板参数继承类吗

template<typename T>
struct A{
  T t;
};

struct B:A<B>{
  unsigned u;
};

int main(){
  B b;
}
模板
结构A{
T;
};
结构B:A{
未签名的u;
};
int main(){
B B;
}
是的,你能做到

您的问题似乎是错误
“A::t”的类型不完整
。例如,见

如果你

  • 在A之前声明B,并且
  • 在结构a中使用指针,它工作得很好

  • structb;
    模板
    结构A{
    T*T;
    };
    结构B:A{
    未签名的u;
    };
    int main(){
    B B;
    }
    
    是的,你能做到

    您的问题似乎是错误
    “A::t”的类型不完整
    。例如,见

    如果你

  • 在A之前声明B,并且
  • 在结构a中使用指针,它工作得很好

  • structb;
    模板
    结构A{
    T*T;
    };
    结构B:A{
    未签名的u;
    };
    int main(){
    B B;
    }
    
    这是可能的

    Template <class T>
    struct A {};
    
    struct B : public A<B> {};
    
    模板
    结构A{};
    结构B:公共A{};
    
    它不能很好地处理容器。参见Stroustrup 19.2.4 p686的“编程原理和实践第二版”

    这是可能的

    Template <class T>
    struct A {};
    
    struct B : public A<B> {};
    
    模板
    结构A{};
    结构B:公共A{};
    

    它不能很好地处理容器。参见Stroustrup 19.2.4 p686的“编程原理和实践第二版”

    可以,但在上面的例子中,不能将其用作非静态数据成员

    template<typename T>
    struct A{
      static T t;
    };
    template<typename T>
    T A<T>::t=T();
    
    struct B:A<B>{
      unsigned u;
    };
    
    int main(){
      B b;
    }
    
    模板
    结构A{
    静态T;
    };
    模板
    T A::T=T();
    结构B:A{
    未签名的u;
    };
    int main(){
    B B;
    }
    
    您可以,但在上面的例子中,它不能,您不能将它用作非静态数据成员

    template<typename T>
    struct A{
      static T t;
    };
    template<typename T>
    T A<T>::t=T();
    
    struct B:A<B>{
      unsigned u;
    };
    
    int main(){
      B b;
    }
    
    模板
    结构A{
    静态T;
    };
    模板
    T A::T=T();
    结构B:A{
    未签名的u;
    };
    int main(){
    B B;
    }
    
    这里的子类作为模板参数给出。是的,这是可能的。只是不是
    T的成员。查看以了解它的用途。这里的子类作为模板参数提供。是的,这是可能的。只是不是
    T的成员。查看,看看它有什么用处;但是在
    结构a
    中添加对类型
    T
    的引用,它无法编译,因为编译器在代码中的模板实例化点不知道类型
    B
    (类似于a
    #def
    )。。所以,虽然您的示例是正确的,但它并没有考虑到定义的范围以及它如何影响模板;但是在
    结构a
    中添加对类型
    T
    的引用,它无法编译,因为编译器在代码中的模板实例化点不知道类型
    B
    (类似于a
    #def
    )。。所以,虽然你们的例子是正确的,但它并没有考虑到定义的范围以及它如何影响模板。只有第2点是必要的。我本能地在A之前声明了B,但这是可选的。只有第2点是必要的。但是
    T
    的静态数据成员将非常无用。但是
    T
    的静态数据成员将非常无用。