以下是否有效?或者我怎样才能得到与此相近的东西。
template<class T_> class Template {
//something
};
class Parent {
public:
Template<Parent> variable;
Parent() : variable(this) { }
};
class Derived : public Parent {
public:
Template<Derived> variable;
Derived() : Parent() { }
}
提前致谢。
答案 0 :(得分:6)
技术上“有效”,因为你的编译器必须接受它(可能警告你,恕我直言应该),但它不会做你所做的认为它确实如此:派生的variable
与Parent
是分开的,不显式初始化(因此它使用Template<>
的默认ctor。) / p>
答案 1 :(得分:1)
如果您想在基类和派生类中使用相同名称的变量,则不需要模板。
只需定义它们,然后从派生访问 - &gt;变量和 - &gt; Base ::变量中定义它们。这是两个不同的变量。
答案 2 :(得分:1)
几种次要类型。
但主要问题是Parent在Template上使用了一个不存在的构造函数。
template<class T>
class Template
{
public:
Template() {} // Used in Derived
Template(T* t) {} // Used in Parent
};
class Parent
{
public:
Template<Parent> variable;
Parent() : variable(this) {}
};
class Derived : public Parent
{
public:
Template<Derived> variable;
Derived() : Parent() {}
};
我很好奇你想要达到的目标 这是“奇怪的重复发生的模板”模式的某种变化吗?
答案 3 :(得分:1)
你不应该接近这一点,因为这种对公共变量的重新定义违反了Liskov Substitution Principle - 你的Derived
变得比Parent
更具限制性,并且无法替代它place,因此它不应该是超类/子类关系。
此外,如果它允许你重新定义一个实际重用相同内存位置的意义上的字段,那么它也会打破类型系统:Parent
中的所有方法都期望variable
属于Template<Parent>
类型;如果它实际上是Template<Derived>
的实例,则无法保证Template<T>
中的T
是协变的。