1

私はアルゴリズム ホスト クラスを構築しており、データ ストレージと一連のアルゴリズムをポリシー クラスとして使用しています。操作対象のデータは、ポリシー ホスト クラス内のコンポジション (コレクション) を使用してカプセル化され、2 つのアルゴリズム (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 を使用しています。ありがとう!

4

1 に答える 1

2

あなたのケースはADLとは何の関係もありませんが、あなたの定義がfirstExecute基本クラスからの定義を隠しているという事実があります。これらの行を追加すると:

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

ではAlgorithmHost、基本クラスのメンバーが再び検索されます。これは、シャドウイングに関する別の質問/回答です。

于 2013-04-08T16:45:22.587 に答える