質問
これは多かれ少なかれブーストドキュメントから貼り付けられたコピーであり、私はエラーを取得し続けます(実際には多くのエラー)
テンプレートクラスがBoostを使用して数字のみで使用されることを確認しようとしています。これは、数字のみを使用するテンプレートクラスを作成するのではなく、ブーストの演習です。
#include <boost/utility/enable_if.hpp>
#include <boost/type_traits/is_arithmetic.hpp>
using namespace boost;
template <class T>
class A<T, typename enable_if<is_arithmetic<T> >::type> // <-- this is line 9
{
int foo;
};
int main() {
return 0;
}
最初のいくつかのエラーc2143:構文エラー:紛失 ';' '<'の前:9行目C2059:構文エラー: '<':行9 C2899:Typenameはテンプレート宣言の外で使用できません
Visual Studio 2005ところで。
解決
実際に呼ばれるクラステンプレートを作成したことはありません A
. 。あなたはただ作成しました 専門化. 。最初に作成する必要があります A
イネーブラーが動作するためのダミーパラメーターを備えたクラステンプレート。
using namespace boost;
template <class T, class Enable = void>
class A { };
template <class T>
class A<T, typename enable_if<is_arithmetic<T> >::type>
{
int foo;
};
他のヒント
専門化する前 A
クラステンプレート少なくとも宣言する必要があります。
解決策は、あなたが達成しようとしていることに依存します。なぜなら、あなたが助けを求めている問題は、何らかの問題に対する試行された解決策だからです。
ブーストドキュメント の enable_if
この例がありますが、これはおそらくあなたが望むものです:
template <class T, class Enable = void>
class A { ... };
template <class T>
class A<T, typename enable_if<is_integral<T> >::type> { ... };
template <class T>
class A<T, typename enable_if<is_float<T> >::type> { ... };
乾杯&hth。、
それはあなたが欠けているからです ::type
最後に。 enable_ifコンストラクトは、時々エラーが発生する可能性があります。私はこの小さなマクロを使用してそれを簡単にします:
#define CLASS_REQUIRES(...) typename boost::enable_if<boost::mpl::and_<__VA_ARGS__, boost::mpl::bool_<true> > >::type
次に、上記のコードを次のように記述できます。
template <class T, class Enable = CLASS_REQUIRES(is_arithmetic<T>)>
class A
{
int foo;
};
目ではずっと簡単です。
所属していません StackOverflow