c++模板问题
Posted
技术标签:
【中文标题】c++模板问题【英文标题】:c++ template problem 【发布时间】:2011-04-10 20:15:16 【问题描述】:我有一个具有其他用途的模板的类:
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.
这是模板参数列表丢失
的错误我该如何解决这个问题?
【问题讨论】:
【参考方案1】:最简单的方法是将该函数也设为模板:
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
;
然后你可以引用那个base,当你调用一个虚函数时它会动态调度:
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
;
【讨论】:
编译器告诉您,您必须将模板参数传递给MyClass
。
抱歉,这并不正确,因为另一个类方法需要访问 MyClass 属性,这是我的错误,我没有这么说。我会在一秒钟内更新我的 q【参考方案2】:
放置一个通用的基类怎么样。
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)
/* ... */
;
【讨论】:
没看到你加了这个,不是故意踩脚的。 也感谢您的回答。我为这个不错的答案投票赞成你,但我更了解 GMan 的答案。【参考方案3】:如果要创建“多模板”数组,最好使用非模板类作为模板类的基类。或者你可以制作一个模板数组并在其中存储任何对象。
【讨论】:
【参考方案4】:你的类中的文本变量是私有的,所以除非你的 bar 函数是类的方法,否则你不能像那样合法地使用它
【讨论】:
很好的观察,但我认为我们可以假设这是一个错字。 :)以上是关于c++模板问题的主要内容,如果未能解决你的问题,请参考以下文章