首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在MyClass<T扩展OtherClass>中实现C++?

如何在MyClass<T扩展OtherClass>中实现C++?
EN

Stack Overflow用户
提问于 2013-09-24 15:05:17
回答 3查看 179关注 0票数 1

有人能告诉我如何在C++中实现这个Java吗?

代码语言:javascript
运行
复制
  public class MyClass<T extends OtherClass>{
    ....
  }

我已经在C++中测试过这个:

代码语言:javascript
运行
复制
 template<class T, class OtherClass>
 class MyClass
 {
    public:
          MyClass();
  }

但是我得到了错误:invalid use of template-name 'MyClass' without an argument list

问候

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-09-24 15:08:21

您可以结合使用std::is_base_ofstatic_assert

代码语言:javascript
运行
复制
template<class T>
class MyClass
{
    static_assert( std::is_base_of< OtherClass, T >::value, "T does not extend OtherClass");

public:
    MyClass();
};

(当然,您也可以将OtherClass作为额外的模板参数,以防止您需要更加灵活)

票数 6
EN

Stack Overflow用户

发布于 2013-09-24 15:08:26

如果您声明一个模板类(即您使用template<class T, class OtherClass>所做的),那么您必须使用您声明的模板。由于您没有在TOtherClass中使用MyClass,所以会得到编译器错误。

至于如何在T extends OtherClass中实现C++,并不是很简单,因为C++具有多重继承,但是可以在stl中使用is_base_of函数。

票数 1
EN

Stack Overflow用户

发布于 2013-09-26 08:38:28

通常,在C++中,您只需使用:

代码语言:javascript
运行
复制
template<class T>
class MyClass

你不需要说任何类似extends OtherClass的话。

这是一个解释:

在C++和Java中,当您访问对象的方法或字段时,编译器必须确保对象表达式的静态类型支持该方法或字段,否则它将无法编译。

在Java中,泛型类和方法只编译一次。编译泛型类或方法时,未知类型参数(如T)是或可能是什么类型参数。因此,要使编译器允许访问Object未提供的方法和字段,就必须进行限制。之所以有绑定T extends OtherClass,是因为在MyClass的某个地方,它试图访问T类型表达式上的方法或字段,该表达式由OtherClass提供。因此,此绑定允许编译器进行类型检查并成功编译.

相反,在C++中,模板化类和方法为每个不同类型的参数编译一次(称为模板的每个“实例化”),就像编译器复制和粘贴模板代码的副本一样,并为代码中的每个T替换实际的类型参数。因此,在编译模板化类或方法时,确切地知道T是什么类型。绑定的规范(就像Java中的那样)是不必要的,因为编译器可以直接检查T是否支持给定的方法或字段。如果TOtherClass的一个子类型,它将成功编译。如果T不是OtherClass的一个子类型,那么很可能它将没有该名称的方法或字段,即使有,它也可能没有合适的类型,因此很可能无法编译。基本上是鸭子打字。

(不太可能,但有可能,您有一个不同的、无关的类型,它不是OtherClass的子类型,它的方法和字段的名称和类型与OtherClass中使用的方法和字段的名称和类型相同,并且如果您试图用该类型参数化MyClass,编译器不会抱怨它。然而,这种类型的存在可能是错误的设计,而且您不可能意外地在错误的地方使用这种类型。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18985288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档