我有一个类,其中有一个模板用于其他目的:
template<class t>
class MyClass {
public: //of course public...
t foo;
std::string text;
}
我有另一个类,该方法通过参数获取所有类的这些类,并希望将指针存储在数组中。该类不希望仅使用公共属性/方法访问类的特定(临时)部分。
class Container {
public: //of course public...
MyClass* array; //this is allocated with some magic.
void bar(MyClass& m) {
and want to store the class in a MyClass* array.
}
}
这是缺少模板的参数列表
的错误我该如何解决这个问题?
答案 0 :(得分:5)
最简单的方法是将该函数设为模板:
template <class t>
void bar(MyClass<t>& m) {
// ...
}
请注意,这应该是const MyClass<t>&
,因为您无需修改它。
您的新代码毫无意义。没有像MyClass
类型的对象那样,因为MyClass
是模板。如果你想对这些类进行操作而不管它们的模板参数如何,那么你需要将非模板部分分解为基类:
class MyClassBase
{
public:
// polymorphic base classes should always have virtual destructors
~MyClassBase() {}
virtual void some_function() = 0;
};
template <typename T>
class MyClass : public MyClassBase
{
public:
// implement abstract functions
void some_function()
{
// template argument T is available here
}
};
然后你可以参考那个基础,当你调用虚函数时它会动态调度:
class Container
{
public:
// no magic: use a std::vector for dynamic arrays
std::vector<MyClassBase*> array; // not by value! avoid slicing
void bar(MyClassBase& m)
{
array.push_back(&m);
}
void baz()
{
array[0]->some_function(); // for example
}
};
答案 1 :(得分:3)
如何建立一个共同的基类。
class MyClassCommon {
protected:
~MyClassCommon() { }
public:
std::string text;
};
template<class t>
class MyClass : public MyClassCommon {
public: // of course public...
t foo;
};
class Container {
public: // of course public...
MyClassCommon* array; // this is allocated with some magic.
void bar(MyClassCommon& m) {
/* ... */
}
};
答案 2 :(得分:1)
如果要创建“多模板”数组,最好使用非模板类作为模板类的基类。或者您可以创建模板数组并在其中存储任何对象。
答案 3 :(得分:0)