2013-04-08 36 views
1

我正在构建一个算法宿主类,并将数据存储和一堆算法用作策略类。操作的数据在策略主机类中使用组合(Collection)进行封装,两种算法(第一,第二)公开继承(多重继承)。重载策略类​​模板的成员函数

当我尝试从主机类的成员函数访问策略类模板的成员函数时,我只能使用完全限定名称来执行此操作,并且我期望ADL应该在宿主类中工作。

下面是示例代码:

#include <iostream> 


template<typename Element> 
class MapCollection 
{ 
    // Map implementation 
    public: 

     // Programming to an (implicit) interface 
     template<typename Key> 
     void insertElement(Element const & e, Key const& k) {} 

     template<typename Key> 
     void getElement(Element const& e, Key const& k) {} 
}; 

template<typename Element> 
class VectorCollection 
{ 
    // Vector implementation 
    public: 

     template<typename Key> 
     void insertElement(Element const & e, Key const& k) {} 

     template<typename Key> 
     void getElement(Element const& e, Key const& k) {} 
}; 

template<typename Collection> 
class FirstAlgorithm 
{ 
    public: 

     void firstExecute(Collection& coll) 
     { 
      std::cout << "FirstAlgorithm::execute" << std::endl; 
     } 
}; 

template<typename Collection> 
class SecondAlgorithm 
{ 
    public: 

     void secondExecute(Collection const & coll) 
     { 
      std::cout << "SecondAlgorithm::execute" << std::endl; 
     } 
}; 

template 
< 
    typename HostConfigurationTraits 
> 
class AlgorithmHost 
: 
    public HostConfigurationTraits::First, 
    public HostConfigurationTraits::Second 
{ 
    public: 
     typedef typename HostConfigurationTraits::Collection Collection; 

    private: 
     Collection data_; 

    public: 

     // ADL not working? 
     void firstExecute() 
     { 
      // This works: 
      //HostConfigurationTraits::First::firstExecute(data_); 

      // This fails: 
      this->firstExecute(data_); 
     } 

     // ADL not working? 
     void secondExecute() 
     { 
      // This works: 
      //HostConfigurationTraits::Second::secondExecute(data_); 

      // This fails: 
      this->secondExecute(data_); 
     } 
}; 

class EfficientElement {}; 

struct DefaultAlgorithmHostTraits 
{ 
    typedef EfficientElement Element; 
    typedef VectorCollection<Element> Collection; 
    typedef FirstAlgorithm<Collection> First; 
    typedef SecondAlgorithm<Collection> Second; 
}; 

int main(int argc, const char *argv[]) 
{ 

    AlgorithmHost<DefaultAlgorithmHostTraits> host; 

    // Breaks here: 
    host.secondExecute(); 
    host.firstExecute(); 

    return 0; 
} 

难道这引起ADL,还是我放错了我的疑虑? :)

我使用的是g ++ 4.4.3。谢谢!

回答

2

你的情况与ADL无关,但事实上你的firstExecute的定义影响了基类的定义。如果添加这些行:

using HostConfigurationTraits::First::firstExecute; 
using HostConfigurationTraits::Second::secondExecute; 

in AlgorithmHost,它会再次找到基类的成员。这里有另一个关于阴影的question/answer

+0

项目33,Effective C++。 (headbang)谢谢! :) – tmaric 2013-04-08 17:02:31

相关问题