2
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:エラーC2039:'BROKER':broker_def::brokerDisTradableのメンバーではありません'

何か案が?

ありがとう!

4

5 に答える 5

5

派生型の内部型はまだ定義されていないため、派生型の内部型をベースの関数宣言で使用することはできません。派生型は宣言されるだけです。

これを回避するには、型特性パラメーターや追加のテンプレートパラメーターなど、いくつかの方法があります。これらは、 Comp.lang.c ++。moderatedhttpのCuriously Recurring Template Patternで、Derivedで定義された型を使用してBaseで完全に説明されています。 ://groups.google.com/group/comp.lang.c++.moderated/browse_thread/thread/a99148265cb43680/b2581e058ffe8c91?#b2581e058ffe8c91

于 2011-02-16T12:11:51.267 に答える
1

列挙値を配列へのインデックスとして使用しているため、パラメータタイプをbrokerToStrに変更してintに変更できます。

struct broker
{
    typedef T typeBroker;

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

また、静的メンバーではないため、typeBroker::listBroker[i]機能しません。listBroker

于 2011-02-16T12:10:56.643 に答える
1

brokerDisTradableなぜあなたがから継承しているのかわかりませんborder<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;
}
于 2011-02-16T12:11:10.353 に答える
1

問題の簡単な例:

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>
{  
};
于 2011-02-16T12:24:52.570 に答える
0

brokerDisTradable : broker<brokerDisTradable>不完全なタイプのようです(内部の無限の遺産)

struct brokerDisTradableと使用broker<brokerDisTradable>が動作します。

于 2011-02-16T12:13:25.487 に答える