2016-04-05 5 views
0

私はC++でメタプログラミングについて学んでいます。私はタイプの要素を持つクラスAを設計しています。ここで、Tは何らかの算術型です。どのようにしてそのようなオブジェクトを構築できますか?ここで算術演算専用のテンプレートオブジェクトはどのように構築できますか?

は私の試みです:

#include <iostream> 
#include <type_traits> 

template <typename T, 
      typename = typename std::enable_if<std::is_arithmetic<T>::value, T>::type> 
struct A { 
    A<T>(T t) : t(t) {} 
    T t; 
}; 

int main() { 
    A<int> a{4}, b{2}; 
    std::cout << a.t + b.t << '\n'; 
} 

私はこれをコンパイルしようとすると、私は次のエラーを取得する:

error: expected ')' before 't' A<T>(T t) : t(t) {}

私の周りで検索しましたが、エラーはかなり一般的なので、私私の問題に対する正確な解決策を見つけることができません。

私が-std=c++14gcc(Homebrew gcc 5.3.0)5.3.0でコンパイルしています。

+1

SFINAEの一部を除いて、あなたは 'static_assert'でより良いエラーメッセージを表示します。 – Jarod42

答えて

2

コンストラクタから<T>を削除します。コンストラクタはテンプレートではなく、クラスはです。

template <typename T, 
      typename = typename std::enable_if<std::is_arithmetic<T>::value, T>::type> 
struct A { 
    A(T t) : t(t) {} 
    T t; 
}; 
+2

それは私の愚かだった。 – erip

関連する問題