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