コンパイルに失敗している次のコードがあります。
#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
ません (そして、私が知る限り、型を返します)。