Ger*_*ári 1 c++ templates class
我有一个类,其中有一个模板用于其他目的:
template<class t>
class MyClass {
public: //of course public...
t foo;
std::string text;
}
Run Code Online (Sandbox Code Playgroud)
我有另一个类,该方法通过参数获取所有类的这些类,并希望将指针存储在数组中.该类不希望仅访问类的特定(临时)部分的公共属性/方法.
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.
}
}
Run Code Online (Sandbox Code Playgroud)
这是模板的参数列表缺失的错误
我怎么能解决这个问题?
最简单的方法是将该函数作为模板:
template <class t>
void bar(MyClass<t>& m) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
请注意,这应该是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
}
};
Run Code Online (Sandbox Code Playgroud)
然后你可以参考那个基础,当你调用虚函数时它将动态调度:
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
}
};
Run Code Online (Sandbox Code Playgroud)