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

时间:2016-04-16 12:26:21

标签: c++ class inheritance polymorphism

我很难搞清楚如何制作模板专业化。不幸的是,这次谷歌和SO无法帮助我。

对于基类:

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

此代码:

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

输出,如果还不是很明显:

class derived<int> can't return int

class derived<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > can't return int

我应该如何对派生进行专门化,所以getInt()会返回mValue?类似的东西:

template<>
int derived<int>::getInt() { return mValue; } 

这不起作用。

更清楚的是,当我调用arg-&gt; getInt()时,我希望pe输出23,当我调用arg-&gt; getInt()时,我会抛出基类中的异常。 你能给我一个示例代码吗?谢谢。

2 个答案:

答案 0 :(得分:1)

derived模板没有getInt()方法。你不能专注于不存在的东西。

您必须专门化整个模板。试试这个:

template<>
class derived<int> : public base
{
public:
    derived() {}
    derived(int value) { mValue = value; }
    int getInt() override { return mValue; } 
private:
    T mValue;
};

答案 1 :(得分:1)

您可以专门设定int的模板:

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

    int getInt() override { return mValue; }

private:
    int mValue;
};