【问题标题】:Get type of the parameter from list of objects, templates, C++从对象、模板、C++ 列表中获取参数的类型
【发布时间】:2015-11-20 00:32:04
【问题描述】:

这个问题是我上一个问题的后续问题

Get type of the parameter, templates, C++

有如下数据结构:

Object1.h

template <class T>
class Object1
{
  private:
     T a1;
     T a2;
  public:
     T getA1() {return a1;}
     typedef T type;
};

Object2.h

template <class T>
class Object2: public Object1 <T>
{
   private:
      T b1;
      T b2;
  public:
     T getB1() {return b1;}
}

列表.h

template <typename Item>
struct TList
{
  typedef std::vector <Item> Type;
};

template <typename Item>
class List
{
  private: 
   typename TList <Item>::Type items;

  public:
   Item & operator [] ( const unsigned int index ) {return this->items[index];}
};

有没有办法从对象列表中获取对象的类型T(即对象不是函数的直接参数而是模板参数)?

进程.h

class Process
{
  template <class Object>
  static void process (List <Object> *objects)
  {
    typename Object::type a1 = (*objects[0]).getA1(); // g++ error: 'Object1<double>*' is not a class, struct, or union type
  } 
};

但是他的构造是有效的(即Object代表函数的一个参数)

template <class Object>
void process (Object *o1) 
{
    typename Object::type a1 = (*o1).getA1(); // OK
}

有主程序:

int main()
{
   Object1 <double> o1;
   Object1 <double> o1;

   List <Object1 <double> > list;

   Process::process(&list);

}

【问题讨论】:

  • 看起来不错。我不知道你为什么会出错。
  • 对了,List类模板是怎么实例化的?你传递什么类型的参数?
  • 能否请您发布您实际尝试编译的代码? process(List&lt;Object&gt; *objects) 中的 objects[0].getA1() 正在调用不存在的 List&lt;T&gt;::getA1(),并且错误消息引用了在任何地方都没有提及的 Object1&lt;double&gt;*。更不用说o1.getA1() 不能工作,因为o1 是一个指针。
  • 为什么不通过引用传递?
  • 错误在这里。我写了静态 void 进程(List *objects),而不是静态 void 进程(List *objects)。感谢您的帮助...

标签: c++ templates types


【解决方案1】:

问题在于objects[0],其中objects 是一个指针。你应该把它写成 (*objects)[0] 来调用指向的对象的 operator[]。

【讨论】:

  • 也许甚至使用引用来传递列表:void process (List &lt;Object&gt; &amp;objects) 那么这个问题也不会出现。
  • 谢谢,出现错误。而不是静态无效进程(List *objects)我写了静态无效进程(List *objects)。
猜你喜欢
  • 2011-06-30
  • 1970-01-01
  • 2014-05-03
  • 1970-01-01
  • 2021-07-09
  • 2015-02-19
  • 2012-10-09
  • 1970-01-01
相关资源
最近更新 更多