簡體   English   中英

C ++錯誤枚舉和CRTP

[英]C++ error enum and CRTP

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 };
};

錯誤:錯誤C2039:“經紀人”:不是broker_def :: brokerDisTradable的成員

任何想法?

謝謝!

您不能在基礎函數的聲明中使用派生類型的內部類型,因為尚未定義派生類型的內部類型,只能聲明派生類型。

有許多方法來解決這個問題,包括類型特征參數和額外的模板參數,並且它們在基地的使用派生定義的類型,在 comp.lang.c 的奇異遞歸模板模式 ++完美討論主持: HTTP :?//groups.google.com/group/comp.lang.c++.moderated/browse_thread/thread/a99148265cb43680/b2581e058ffe8c91#b2581e058ffe8c91

由於您將枚舉值用作數組的索引,因此可以將參數類型由brokerToStr更改為int:

struct broker
{
    typedef T typeBroker;

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

另外,由於listBroker不是靜態成員,因此typeBroker::listBroker[i]不起作用。

我不明白為什么您要從border<brokerDisTradable>繼承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;
}

問題的簡化示例:

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>
{  
};

brokerDisTradable : broker<brokerDisTradable>似乎是不完整的類型(內部有無限的遺產)

struct brokerDisTradable並使用broker<brokerDisTradable>將起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM