【问题标题】:C++ error enum and CRTPC++ 错误枚举和 CRTP
【发布时间】:2011-02-16 11:54:02
【问题描述】:
template<class T>
struct broker
{
    typedef T typeBroker;
    static std::vector<std::string> extractListBroker(const std::string& broker)
    {
        std::vector<std::string> vec;

        if(broker.empty())          
        {
            for(int i=0;i<typeBroker::nbBroker;++i)
                vec.push_back( typeBroker::listBroker[i] );         
        }           
        else
        {
            typedef boost::tokenizer<boost::char_separator<char> > my_tok;

            boost::char_separator<char> sep( ";" );

            my_tok tok( broker, sep );

            for ( my_tok::const_iterator i = tok.begin(); i != tok.end(); ++i )  
                vec.push_back( *i ); 
        } 
        return vec;
    }

        std::string brokerToStr(typename typeBroker::BROKER i) //<--Problem here !!
    {
        return typeBroker::listBroker[i];           
    }
};


struct brokerDisTradable  : broker<brokerDisTradable>{
    std::vector<std::string> listBroker;
    brokerDisTradable()
    {
        listBroker.push_back("BRIDGE1" );
        listBroker.push_back("BRIDGELONDON" );
        listBroker.push_back("RECY" );
        listBroker.push_back("CURRENEX" );
    }
    static const int nbBroker = 2;
    enum BROKER  { BRIDGE1, BRIDGELONDON, RECY, CURRENEX };
};

errro : error C2039: 'BROKER' : is not a member of broker_def::brokerDisTradable'

有什么想法吗?

谢谢!

【问题讨论】:

  • 提示:如果您希望人们了解认为您的代码在做什么,请不要在粘贴的代码中保留非英语 cmets。
  • broker_def 是一个命名空间抱歉

标签: c++ enums crtp


【解决方案1】:

你不能在基类的函数声明中使用派生类型的内部类型,因为派生类型的内部类型还没有定义,派生类型只是声明.

有很多方法可以解决这个问题,包括类型特征参数和附加模板参数,它们在 Base's 中使用 Derived 中定义的类型以奇怪的重复模板模式进行了完美的讨论 comp.lang.c++.moderatedhttp://groups.google.com/group/comp.lang.c++.moderated/browse_thread/thread/a99148265cb43680/b2581e058ffe8c91?#b2581e058ffe8c91

【讨论】:

    【解决方案2】:

    由于您使用枚举值作为数组的索引,您可以将参数类型从 brokerToStr 更改为 int:

    struct broker
    {
        typedef T typeBroker;
    
        std::string brokerToStr(int i)
        {
            return typeBroker::listBroker[i];           
        }
    

    另外,typeBroker::listBroker[i] 将无法工作,因为 listBroker 不是静态成员。

    【讨论】:

    • 不,它会像使用 CRTP 一样工作。它与 brokerDisTradable 类的任何其他成员函数一样。
    【解决方案3】:

    我不明白你为什么要从border&lt;brokerDisTradable&gt; 继承brokerDisTradable。可能你需要做的是:

    struct brokerDisTradable {
        std::vector<std::string> listBroker;
        brokerDisTradable()
        {
            // ...
        }
        static const int nbBroker = 2;
        enum BROKER  { BRIDGE1, BRIDGELONDON, RECY, CURRENEX };
    };
    
    int main() 
    { 
      brokerDisTradable t;
      broker<brokerDisTradable> b;
      // ...
      return 0;
    }
    

    【讨论】:

      【解决方案4】:

      问题的简化示例:

      template <class T>
      struct X
      {
          void foo(typename T::Enum);
      };
      
      struct Y: X<Y>  //<-- X instantiate here, but at this point the compiler only knows
                      //that a struct called Y exists, not what it contains
      {
          enum Enum {Z}; 
      };
      

      作为一种可能的解决方法,也许将枚举移出 Y 并将模板参数添加到 X。

      template <class T, class EnumType>
      struct X
      {
          void foo(EnumType);
      };
      
      enum Y_Enum {Z};
      
      struct Y: X<Y, Y_Enum>
      {  
      };
      

      【讨论】:

        【解决方案5】:

        brokerDisTradable : broker&lt;brokerDisTradable&gt;好像是不完整类型(里面有无限传承)

        struct brokerDisTradable 和使用broker&lt;brokerDisTradable&gt; 将起作用..

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-02-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多