2

テンプレート引数として別のクラスに渡されるクラスから静的メソッドのアドレスを取得しようとしています。以下は、簡略化された例です。

#include <iostream>
#include <array>

using namespace std;

typedef size_t Data;

class MyFunction
{
private:
    static const std::array<std::string, 3> values;

public:
    template<size_t N>
    static void Func(const Data& aData)
    {
        size_t index = (N > aData ? 2 : (N == aData ? 1 : 0) );
        cout << "Function::Func<"<< N << ">:\t" << N << values[index] << aData << endl;
    }

    typedef decltype(&Func<0>) type;    
};

const std::array<std::string, 3> MyFunction::values {"<", "=", ">"};

template<class Function, size_t N>
class FunctionManager
{
private:
    static const typename Function::type func_;

    static constexpr typename Function::type Create()
    {
        return &Function::Func<N>; //ERROR: Causes "overloaded function with no contextual information".
    }
public: 
    void operator()(const Data &aData) const
    {
        func_(aData);
    }
};

template<class Function, size_t N>
const typename Function::type FunctionManager<Function, N>::func_ = FunctionManager<Function, N>::Create();

int main()
{
    static const size_t N = 6;
    auto man = FunctionManager<MyFunction, N>();
    man(N/2);
    return 0;
}

コードはこちらでもご覧いただけます。問題は Create() 関数にあります。「コンテキスト型情報がないオーバーロードされた関数のアドレス」というエラーが表示されます。ただし、&Function::Func を &MyFunction::Func に変更すると、正常に動作します。実際の関数をテンプレート パラメーターにし、ハードコードしないようにしたいのですが、この問題を解決する方法を知っている人はいますか? 私がやろうとしていることを行うにはもっと簡単な方法があることに注意してください。ただし、単一の Function::type の代わりに実際のコードは、インデックストリックなどを使用してそれらの配列を作成します。

4

1 に答える 1

4

エラーメッセージは確かに頭を悩ませます。不足しているものは次のとおりです。

return &Function::template Func<N>;
//                ^^^^^^^^

FunctionFuncはテンプレート パラメータであり、コンパイラを支援して、ネストされた名前がテンプレートの名前であることを伝える必要があります。

于 2013-10-25T18:35:20.297 に答える