2011-02-16 5 views
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」C++エラーの列挙型とCRTP

任意のアイデア?

ありがとうございます!

+1

先端をXにテンプレートパラメータを追加します。非保管しないでくださいあなたのコードが何をしていると思うかを人々が理解してほしい場合は、貼り付けられたコードでコメントを追加します。 –

+0

'broker_def'とは何ですか? ? –

+0

broker_defは名前空間です申し訳ありません – Guillaume07

答えて

4

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

ありタイプの特性パラメータと追加のテンプレートパラメータを含む、この問題を回避する方法、の数があり、それらは完全にCOMPの不思議な経常テンプレートパターンで、派生で定義された型を使用してベースの中で議論されています。 lang.cに++司会http://groups.google.com/group/comp.lang.c++.moderated/browse_thread/thread/a99148265cb43680/b2581e058ffe8c91?#b2581e058ffe8c91

1

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

struct broker 
{ 
    typedef T typeBroker; 

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

listBrokerではないとしても、typeBroker::listBroker[i]は動作しません。静的メンバー。

+0

いいえ、CRTPを使用している場合と同じように動作します。 'brokerDisTradable'クラスの他のメンバ関数と似ています。 – Asha

+0

大変ありがとうございます。 – Guillaume07

+0

@Asha: "typeBroker :: listBroker [i]"は何が効きますか? –

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

brokerDisTradable : broker<brokerDisTradable>は、不完全型(内部の無限の遺産を)のようです

struct brokerDisTradableと動作しますbroker<brokerDisTradable>を使用して...

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のうちの列挙を移動し、

template <class T, class EnumType> 
struct X 
{ 
    void foo(EnumType); 
}; 

enum Y_Enum {Z}; 

struct Y: X<Y, Y_Enum> 
{ 
};