C++模板问题
我有有一个模板,通过其他用途类:C++模板问题
template<class t>
class MyClass {
public: //of course public...
t foo;
std::string text;
}
和我有另一类方法得到的所有类型的这些类的这些论据,并希望将指针存储在一个阵列。这个类不想访问类的特定(tempalted)部分,只有普通的属性/方法。
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.
}
}
这里是错误的模板缺少
我怎样才能解决这个参数列表?
最简单的方法是使该函数模板,以及:
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
}
};
所以,除非你吧功能是类的方法,如果你想你不能合法使用这样的
良好的观察,但我认为我们可以认为这是一个错字。 :) – GManNickG 2011-04-10 20:19:03
这不是导致错误消息的原因。 – 2011-04-10 20:21:57
你们班文本变量是私有创建一个“多模板”数组,你最好使用非模板cla ss作为模板类的基类。或者你可以创建一个模板数组并存储任何对象。
如何把一个共同的基类。
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) {
/* ... */
}
};
没有看到你添加了这个,并不意味着踩在你的脚趾上。 – GManNickG 2011-04-10 20:37:37
@GMan,没关系。我没有受伤或什么。干杯:) – 2011-04-10 20:38:40
感谢您的回答。我向你提出了这个很好的答案,但我更了解GMAN的答案。 – 2011-04-10 20:45:52
正如编译器告诉你的,你必须**将一个模板参数传递给'MyClass'。 – 2011-04-10 20:23:02
对不起,这是不正确的,因为另一个类方法需要访问MyClass属性,这是我的错误,我没有这么说。我会在第二个 – 2011-04-10 20:23:38
更新我的q谢谢。非常好的答案 – 2011-04-10 20:43:51