Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在派生模板类中专门化方法表单基类_C++_Class_Inheritance_Polymorphism - Fatal编程技术网

C++ 在派生模板类中专门化方法表单基类

C++ 在派生模板类中专门化方法表单基类,c++,class,inheritance,polymorphism,C++,Class,Inheritance,Polymorphism,我很难弄清楚如何进行模板专门化。不幸的是,这一次,谷歌等公司帮不了我 对于基类: class base { public: virtual ~base() = 0; virtual int getInt() { throw std::invalid_argument(std::string(typeid(*this).name()) + " can't return int"); } }; base::~base() {} 和派生类: template<class T&

我很难弄清楚如何进行模板专门化。不幸的是,这一次,谷歌等公司帮不了我

对于基类:

class base
{
public:
    virtual ~base() = 0;

    virtual int getInt() { throw std::invalid_argument(std::string(typeid(*this).name()) + " can't return int"); }
};
base::~base() {}
和派生类:

template<class T>
class derived : public base
{
public:
    derived() {}
    derived(T value) { mValue = value; }

private:
    T mValue;
};
模板
派生类:公共基
{
公众:
派生(){}
派生(T值){mValue=value;}
私人:
T值;
};
此代码:

void proof(base* arg)
{
    try
    {
        std::cout << arg->getInt();
    }
    catch (std::exception& e)
    {
        std::cout << e.what();
    }
    std::cout << "\n\n";
}

int main()
{
    base* a = new derived<int>(23);
    base* b = new derived<std::string>("abc");

    proof(a);
    proof(b);

    delete a;
    delete b;

    return 0;
}
无效证明(基本*arg)
{
尝试
{
std::cout getInt();
}
捕获(标准::异常&e)
{

std::cout派生的
模板没有
getInt()
方法。不能专门化不存在的内容

您必须专门化整个模板。请尝试以下操作:

template<>
class derived<int> : public base
{
public:
    derived() {}
    derived(int value) { mValue = value; }
    int getInt() override { return mValue; } 
private:
    T mValue;
};
模板
派生类:公共基
{
公众:
派生(){}
派生(int值){mValue=value;}
int getInt()重写{return mValue;}
私人:
T值;
};

您可以为
int
专门化模板:

template <> class derived<int> : public base
{
public:
    derived(int value) : mValue(value) {}

    int getInt() override { return mValue; }

private:
    int mValue;
};
派生的模板类:公共基
{
公众:
派生(int值):mValue(value){}
int getInt()重写{return mValue;}
私人:
int值;
};

默认构造函数看起来是个糟糕的主意!这意味着什么?我正在尝试封装一些数据类型,以便可以生成多个数据类型的向量。注意:int只是一个示例,我确实有另一个类不封装primite类型。如果这是唯一的解决方案,那么我将不得不反复创建类这是我所不想做的:写10次相同的类,但是用不同的数据类型。谢谢你的帮助。你确定这是唯一的方法吗?是的,这就是C++中的专业化的方法。我确信有其他的方法来设计一个类层次结构,它以不同的方式使用专门化。e、 您可以为getInt()创建“模板类非真正派生的:公共基{};”,专门化“非真正派生的”只有,然后派生的子类不是真正派生的,而不是基类,没有专门化。谢谢你的帮助。但不是另一种解决方案,这样我就可以专门化那个函数吗?@AndreiAndrey:你可以通过中间辅助基类来考虑这个模式,这样你就不必重复任何公共代码。这只是一个假设蛋糕的配料,你还得带上所有其他的。我去找只鸡,我去买鸡蛋。谢谢。
template<>
class derived<int> : public base
{
public:
    derived() {}
    derived(int value) { mValue = value; }
    int getInt() override { return mValue; } 
private:
    T mValue;
};
template <> class derived<int> : public base
{
public:
    derived(int value) : mValue(value) {}

    int getInt() override { return mValue; }

private:
    int mValue;
};