有人能告诉我如何在C++中实现这个Java吗?
public class MyClass<T extends OtherClass>{
....
}我已经在C++中测试过这个:
template<class T, class OtherClass>
class MyClass
{
public:
MyClass();
}但是我得到了错误:invalid use of template-name 'MyClass' without an argument list
问候
发布于 2013-09-24 15:08:21
您可以结合使用std::is_base_of和static_assert。
template<class T>
class MyClass
{
static_assert( std::is_base_of< OtherClass, T >::value, "T does not extend OtherClass");
public:
MyClass();
};(当然,您也可以将OtherClass作为额外的模板参数,以防止您需要更加灵活)
发布于 2013-09-24 15:08:26
如果您声明一个模板类(即您使用template<class T, class OtherClass>所做的),那么您必须使用您声明的模板。由于您没有在T或OtherClass中使用MyClass,所以会得到编译器错误。
至于如何在T extends OtherClass中实现C++,并不是很简单,因为C++具有多重继承,但是可以在stl中使用is_base_of函数。
发布于 2013-09-26 08:38:28
通常,在C++中,您只需使用:
template<class T>
class MyClass你不需要说任何类似extends OtherClass的话。
这是一个解释:
在C++和Java中,当您访问对象的方法或字段时,编译器必须确保对象表达式的静态类型支持该方法或字段,否则它将无法编译。
在Java中,泛型类和方法只编译一次。编译泛型类或方法时,未知类型参数(如T)是或可能是什么类型参数。因此,要使编译器允许访问Object未提供的方法和字段,就必须进行限制。之所以有绑定T extends OtherClass,是因为在MyClass的某个地方,它试图访问T类型表达式上的方法或字段,该表达式由OtherClass提供。因此,此绑定允许编译器进行类型检查并成功编译.
相反,在C++中,模板化类和方法为每个不同类型的参数编译一次(称为模板的每个“实例化”),就像编译器复制和粘贴模板代码的副本一样,并为代码中的每个T替换实际的类型参数。因此,在编译模板化类或方法时,确切地知道T是什么类型。绑定的规范(就像Java中的那样)是不必要的,因为编译器可以直接检查T是否支持给定的方法或字段。如果T是OtherClass的一个子类型,它将成功编译。如果T不是OtherClass的一个子类型,那么很可能它将没有该名称的方法或字段,即使有,它也可能没有合适的类型,因此很可能无法编译。基本上是鸭子打字。
(不太可能,但有可能,您有一个不同的、无关的类型,它不是OtherClass的子类型,它的方法和字段的名称和类型与OtherClass中使用的方法和字段的名称和类型相同,并且如果您试图用该类型参数化MyClass,编译器不会抱怨它。然而,这种类型的存在可能是错误的设计,而且您不可能意外地在错误的地方使用这种类型。)
https://stackoverflow.com/questions/18985288
复制相似问题