在我理解的所有语言中,这是不可能的,但有人告诉我这在C ++中是可能的,但我很难相信它。基本上当你参数化一个类时,你在编译阶段创建一个唯一的类不是吗?
如果我不清楚我的问题,请告诉我。
这是我试图解释我想要做的事情(注意L类):
//; g++ ModifingBaseClassParameter.cpp -o ModifingBaseClassParameter;ModifingBaseClassParameter
#include <iostream>
using namespace std;
template<typename T>
class Base
{
public:
Base() {}
Base(T& t) : m_t(t) {}
T& getMem() {return m_t;}
private:
T m_t;
};
template<typename T>
class F: Base<T>
{};
template<typename T>
class L: F<long>
{};
int main()
{
Base<int> i;
F<float> f;
L<long> l;
cout<<i.getMem()<<endl;
// cout<<f.getMem()<<endl; // why doesn't this work
// cout<<l.getMem()<<endl; // why doesn't this work
}
因为你可以看到(希望我的语法有意义)L类试图将其父级的float参数重新定义为long。这当然不是合法的,但我会与专家不同。
答案 0 :(得分:2)
如果您想询问是否可以在c ++中执行此操作:
template <>
class ParamClass<Type1> : public ParamClass<Type2>
{
};
然后是的,这是可能的。
经常使用它,例如定义模板列表或从其他类型继承特征。
答案 1 :(得分:2)
您要求的内容无法直接完成 - 但您可以通过使用默认模板参数来完成:
template <typename T>
class Base { };
template <typename T = int>
class X : Base<T> {};
class Y : Base<float>
class Z : X<long> {};
在这种特殊情况下,默认模板参数不会增加太多。即使为所有参数提供了默认值,您也必须提供模板参数列表来实例化模板。因此,具有在派生类中重写的默认值通常仅对第二个和后续参数有用。
答案 2 :(得分:1)
#include <iostream>
#include <typeinfo>
using namespace std;
template<typename T>
class Base
{
public:
Base() {}
Base(T& t) : m_t(t) {}
T& getMem() {return m_t;}
private:
T m_t;
};
template<typename T>
class F: public Base<T>
{};
template<typename T>
class L: public F<long>
{};
int main()
{
Base<int> iNTEGER;
F<float> fLOAT;
L<long> lONG;
int x;
cout << typeid(iNTEGER.getMem()).name() << endl;
cout << typeid(fLOAT.getMem()).name() <<endl; // this works now :)
cout << typeid(lONG.getMem()).name() <<endl; // this works now :)
}
默认情况下,继承在c ++中是私有的,一旦公开,stephenmm写的应该是什么,除非你打算问别的什么?
答案 3 :(得分:0)
你正在拍摄模板吗?
template<typename T>
class Base
{
public:
Base() {}
Base(T& t) : m_t(t) {}
T& getMem() {return m_t;}
private:
T m_t;
};
class X: Base<int>
{};
class Y: Base<float>
{};
答案 4 :(得分:0)
您应该尝试编译它:
$ g++ so-test1.c++ -o so-test1.c++ && ./so-test
so-test1.c++:21: error: expected template-name before ‘<’ token
so-test1.c++:21: error: expected `{' before ‘<’ token
so-test1.c++:21: error: expected unqualified-id before ‘<’ token
so-test1.c++: In function ‘int main(int, const char**)’:
so-test1.c++:27: error: aggregate ‘Z z’ has incomplete type and cannot be defined
X不是类模板,因此尝试在
中实例化它是没有意义的class Z: X<long> {};
X没有要覆盖的模板参数。请记住
Base<int>
也不是类模板;它本身就是一个类,但从模板中完全实例化。你可以这样做:
....
template<typename T>
class X: Base<T>
{};
...
class Z: X<long>
{};
但是这里没有关于覆盖任何模板参数的混淆。
template<typename T>
class X: Base<int>
{};
...
class Z: X<long>
{};
也可以,但是这里X中的模板参数未被使用,并且没有被覆盖。
HTH