0

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

テンプレート クラスがブーストを使用して数値でのみ使用されるようにしようとしています。これは、数値のみを使用するテンプレート クラスを作成するのではなく、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 ところで。

4

3 に答える 3

1

それは、最後に が欠けているためです::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;
};

目にとてもやさしいです。

于 2012-02-09T23:08:13.453 に答える
1

という名前のクラス テンプレートを実際に作成したことはありません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;
};
于 2010-11-01T11:09:45.193 に答える
1

クラス テンプレートを特殊化する前Aに、少なくともそれを宣言する必要があります。

解決策は、何を達成しようとしているのかによって異なります。なぜなら、あなたが助けを求めている問題は、ある問題に対して試みられた解決策だからです。

Boostのドキュメントに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.,

于 2010-11-01T11:18:17.643 に答える