Ошибка: называет конструктор, а не тип. при компиляции с g ++ 4.6.1 - PullRequest
2 голосов
/ 05 декабря 2011

Я компилирую код с g ++ 4.6.1 на aix6.1 и получаю эту ошибку: -

ViaChecks.h:14:3: error: 'BuPolygonEX<AllPass<CornerT<NetAndVal<ZVal3> > > >::IOPS::Base {aka BuPolygonCore<bu_polygon_clean_func, no_derivatives, AllPass<CornerT<NetAndVal<ZVal3> > > >::IOPS}::IOPS' names the constructor, not the type

Структура определяется как:

struct ViaSquareCheck : BuPolygonEX<AllPass<CornerT<NetAndVal<ZVal3> > > > {
  typedef BuPolygonEX<AllPass<CornerT<NetAndVal<ZVal3> > > > Base;
  DEFINE_ENGINE_PROPERTIES_INHERIT(Base::IOPS, void update() { Base::update(); i().xregion_1nm_oversize(x0nm); o().xregion_1nm_oversize(x0nm); o().derivatives(x_dom); o().bu_polygonized(yes); }); // via_square_dim property is added inside
  membert(int, amount, -1, ViaSquareCheck);
  ViaSquareCheck();
  ViaSquareCheck* output(DFC* dfc) { return set_output(0,dfc); } // single output returns good vias
  ViaSquareCheck* set_output(int k, DFC* dfc);
  void option(const string& pname, const string& pval); // some options change engine properties
private:
  BadViaMultiplexer<C>* mux;
  GIM2a<APC> bad_via_gim;
  GIM2a<APC> good_via_gim;
  member(bool, linked, false);
  member(bool, ok_45, false);
  void link();
  member(ViaSquareCheckNetProcess*, np,NULL);
};

ОпределениеDEFINE_ENGINE_PROPERTIES_INHERIT: -

#define DEFINE_ENGINE_PROPERTIES_INHERIT(SSSS, extras...) \
struct IOPS : SSSS { \
      EnginePropertiesVector& i() { return SSSS::i(); }; \
      EnginePropertiesVector& o() { return SSSS::o(); }; \
      EngineProperties& i(int n) { return SSSS::i(n); }; \
      EngineProperties& o(int n) { return SSSS::o(n); }; \
      typedef SSSS Base; \
      extras; } ep_; 

Спасибо.

Ответы [ 4 ]

1 голос
/ 06 декабря 2011

Это квалифицированное имя, например Base::IOPS,, нам нужно иметь typename перед этим. Вам нужно передать тип вместо полного имени Base::IOPS, поэтому я определил тип

typedef Base::IOPS MYIOP 

и затем передал этот тип, поэтому ошибка «это не тип» исчезла.

1 голос
/ 05 декабря 2011

Эта диагностика выдается, если вы используете имя

myclass::myclass

Это имя не обозначает класс myclass, но его конструктор (ы)

0 голосов
/ 05 декабря 2011

Я бы сказал, что когда вы говорите:

DEFINE_ENGINE_PROPERTIES_INHERIT(Base::IOPS, ...  

Вы должны написать:

DEFINE_ENGINE_PROPERTIES_INHERIT(Base, ...  

То есть без ::IOPS.

0 голосов
/ 05 декабря 2011

Вы должны предварительно обработать ваш исходный код, например,

g++ -C -E yoursource.cc | grep -v '^#' > yoursource.ii

(grep -v удаляет нумерацию строк)

, а затем скомпилировать предварительно обработанную форму с

g++ -Wall -c yoursource.ii

, тогда посмотрите на места сообщения об ошибке в yoursource.ii

Вы также можете спросить на gcc-help@gcc.gnu.org.

Но, как отмечали другие, ваш код не очень красив ....

...