我正在比较C++和Delphi,发现了一些棘手的问题。
这是非常简单的C++代码:
template<typename T>
class C {
class D {
T x;
}
}
在这种情况下,我们有一个模板类(=通用类)
C
和嵌套类D
也是一个模板类。如果T
是double
,那么D
内部的x
就是double
类型。我不能说这句话:
template<typename T>
class C {
template<typename T>
class D {
T x;
}
}
这是一个错误,因为我已经“在”C
中了,再加上另一个T
就会产生冲突。要解决这个错误,我应该使用不同的名称,比如U
。
template<typename T>
class C {
template<typename U>
class D {
T x;
}
}
在Delphi中,我可以这样写:
type
TClassC<T> = class
private
type
TClassD = class
private
x: T;
end;
end;
如果
T
是一个整数,那么现在 x
也是一个整数,因为(从我在网上阅读的内容中了解到)TClassD
是整数。在Delphi中,这也是合法的:type
TClassC<T> = class
private
type
TClassD<T> = class // <-- note the <T> repeated!!
private
x: T;
end;
end;
现在怎么样?如果我能在中再次声明,这意味着如果没有,我将拥有一个非泛型的TClassD类。我的理解正确吗?
TClassC<T1>
,然后是TClassD<T2>
。 - David HeffernanD
本身不是一个模板类,来自C
的模板只是在作用域内,因此D
可以使用它。在你的第二个C++示例中,有两个名为T
的模板参数确实是命名冲突,因为C++不喜欢在同一作用域中重复标识符。Delphi泛型不同于C++模板(尽管它们使用类似的语法),在这个特定的示例中,Delphi比C++更加灵活。 - Remy LebeauT
。如果是这样,我也会使用不同的名称。 - Rudy Velthuis