重载策略类模板的成员函数

Overloading member functions of policy class templates

本文关键字:成员 函数 策略 重载      更新时间:2023-10-16

我正在构建一个算法主机类,我正在使用数据存储和一堆算法作为策略类。操作的数据在策略主机类中使用组合(Collection)封装,并且公开继承两种算法(First、Second)(多重继承)。

当我尝试从宿主类的成员函数访问策略类模板的成员函数时,我只能使用完全限定名,并且我期望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。谢谢!

您的情况与ADL无关,而是与您对firstExecute的定义遮蔽基类定义的事实有关。如果添加以下行:

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

AlgorithmHost中,它将再次找到基类的成员。这是另一个关于阴影的问题/答案。