2

これの何が問題なのですか?

enable if??? を使用すると、これが機能するはずだと思いました。

ヘルプ??

2 番目のコンストラクターを除外する必要はありませんか?

#include <iostream>
#include <boost/type_traits.hpp>
#include <boost/utility/enable_if.hpp>



template<class T>
class integral_holder{
public:
integral_holder(T value_, typename boost::enable_if_c< boost::is_integral<T>::value>::type* ignore = 0) : value(value_){
    std::cout << "Integral" << std::endl;
}

integral_holder(T value_, typename boost::enable_if_c< boost::is_floating_point<T>::value>::type* ignore = 0) : value(floor(value_)){
    std::cout << "Floating point" << std::endl;
}

private:
  T value;

};

int main(int argc, const char * argv[])
{

   integral_holder<int> a(22);

   return 0;
}
4

1 に答える 1

4

クラス テンプレートからクラスが生成され、そのプロセスでコンストラクターの宣言がインスタンス化されると (本体ではなく、"シグネチャ" のみ)、enable_if 型が無効になり、コンパイラ エラーが発生します。

enable_if 型をコンストラクターのテンプレート パラメーターに依存させる (関数テンプレートにする) 必要があります。SFINAEケースをトリガーするコンストラクターを使用すると、関数テンプレートパラメーターの型を推測するときに無効な型が形成されるため、目標は機能します。

于 2012-07-07T14:12:30.350 に答える