1

コンパイルに失敗している次のコードがあります。

#include <iostream>
#include "boost/mpl/set.hpp"
#include "boost/mpl/at.hpp"
#include "boost/type_traits/is_same.hpp"

struct TypeSet {

    typedef boost::mpl::set<int, float> typeset;

    template<typename T>
    static bool hasType()
    {
        using namespace boost;
        using namespace boost::mpl;
        return is_same< at< typeset, T >::type, T >::value; // <-- ERROR IS HERE
    }  
};


int main(int argc, const char * argv[])
{
    bool hasInt = TypeSet::hasType<int>();
    std::cout << (hasInt ? "set contains int" : "set does not contain int") << std::endl;    
    return 0;
}

コードは Apple LLVM clang 4.1 コンパイラと boost 1.5.2 でコンパイルされており、エラーは「型パラメータのテンプレート引数は型でなければなりません」です - 基本的に、コンパイラはboost::mpl::at型を返さないと不平を言っています。問題のあるコードはブーストのドキュメントからかなりそのまま引用されているため、これの何が問題なのかわかりboost::mpl::atません (そして、私が知る限り、型を返します)。

4

1 に答える 1

5

あなたが必要です

typename at< typeset, T >::type

テンプレートパラメータに依存するためT。したがってtype、このコンテキストでの型であるコンパイラに通知する必要があります。

于 2012-11-17T13:25:22.993 に答える