在所有我知道这是不可能的,但有人告诉我,在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类是试图重新定义其父母的浮动参数是一个漫长的。这当然似乎并不像这是合法的,但我会向不同的专家。

有帮助吗?

解决方案

如果你的意思是问你是否能在C ++中做到这一点:

template <> 
class ParamClass<Type1> : public ParamClass<Type2> 
{
};

然后是,它是可能的。

这是非常经常用于例如从另一种类型的定义模板列表或继承的性状。

其他提示

你问什么不能直接做 - 但你能来非常接近通过使用默认模板参数:

template <typename T>
class Base { };

template <typename T = int>
class X : Base<T> {};

class Y : Base<float>

class Z : X<long> {};

在该特定情况下,默认模板参数不会增加太多。你必须提供一个模板参数列表来实例化一个模板,即使提供了所有参数的默认值。这样,具有你在派生类覆盖默认通常是仅用于第二和随后的参数是有用的。

#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写的应该工作,除非你的意思是问其他的东西?

您需要大约模板?

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>
{};

您应该尝试编译它:

$ 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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top