2011-02-16 172 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

一个小窍门:不要让非 - 如果你想让人们理解你认为你的代码在做什么,你可以在粘贴代码中使用英语评论。 –

+0

什么是'broker_def' ? –

+0

broker_def是一个命名空间对不起 – Guillaume07

回答

4

在基本的函数声明不能​​使用派生类型的内部类型,因为派生类型的内部类型尚未定义,派生类型只有宣称为

有许多的方式来解决这个问题,包括类型特征参数和额外的模板参数,并且它们在基地的使用派生定义的类型,在一个奇异递归模板模式样稿完美地讨论。 lang.C++缓和http://groups.google.com/group/comp.lang.c++.moderated/browse_thread/thread/a99148265cb43680/b2581e058ffe8c91?#b2581e058ffe8c91

1

由于您使用的枚举值作为索引到一个数组,你可以改变参数类型brokerToStr为int:

struct broker 
{ 
    typedef T typeBroker; 

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

此外,typeBroker::listBroker[i]不会为listBroker工作是不是一个静态成员。

+0

不,它会像使用CRTP一样工作。它就像类brokerDisTradable的其他成员函数一样。 – Asha

+0

好的非常感谢 – Guillaume07

+0

@Asha:什么工作 - “typeBroker :: listBroker [i]”? –

1

我不明白你为什么从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; 
} 
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和添加一个模板参数X.

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

enum Y_Enum {Z}; 

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