質問

これは多かれ少なかれブーストドキュメントから貼り付けられたコピーであり、私はエラーを取得し続けます(実際には多くのエラー)

テンプレートクラスが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;
};

目ではずっと簡単です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top