2016-12-07 12 views
0

考えられるメソッドを削除するためにenable_ifステートメントを使用しています。enable_ifを使用してコードを削除する方法

#include "gmpxx.h" 
#include <iostream> 

template <typename T> 
struct is_ring_field { 
}; 

template <> 
struct is_ring_field<int> { 
    static const bool value = false; 
}; 

template <> 
struct is_ring_field<mpq_class> { 
    static const bool value = true; 
}; 

template<typename T> 
std::enable_if<is_ring_field<T>::value,int> RankMat(T const& Input) 
{ 
    return 10; 
} 

template<typename T> 
std::enable_if<(not is_ring_field<T>::value),int> RankMat(T const& Input) 
{ 
    return 20; 
} 

int main() 
{ 
    int M1=10; 
    mpq_class M2=3; 
    std::cerr << "FICT rank(M1)=" << RankMat(M1) << "\n"; 
    std::cerr << "FICT rank(M2)=" << RankMat(M2) << "\n"; 
} 

最後の目的は、入力時の代数データ型によって異なるメソッドを持つことです。他の特質のために、それは私のために働いたが、このものではなかった。この場合、コンパイラは不思議なことに、コールが曖昧であると言います。つまり、std :: enable_ifが失敗しました。

+1

「RankMat」の2つのオーバーロードを確認してください。オーバーロードのどの部分が違うのですか?その部分を有効な過負荷と異なる機能の唯一の部分にすることはできますか? – NathanOliver

+2

'typename std :: enable_if <*,*> :: type'を忘れていませんか? –

+0

はい、私はメッセージを書いた後に気付きました。 clang ++とg ++の両方のメッセージは役に立たなかった。 –

答えて

-1

これを間違った位置に配置しました。 これを試してみてください:

template<typename T> 
int RankMat(T const& Input, typename std::enable_if<is_ring_field<T>::value,T>::type* = 0) 
{ 
     return 10; 
} 

template<typename T> 
int RankMat(T const& Input, typename std::enable_if<(not is_ring_field<T>::value),T>::type* = 0) 
{ 
     return 20; 
} 

またはこの:

template<typename T, typename TT = is_ring_field<T>> 
int RankMat(T const& Input) 
{ 
     return TT::value ? 10 : 20; 
} 
+0

実際にはこれはsfinaeでソフトエラーを発生させる唯一のコンテキストではありません... [this](http://melpon.org/wandbox/permlink/7MK1lLnULUVp04JY)と[this](http://melpon.org/ wandbox/permlink/SlFEgbxo6ZzxDATO)。あなたが提案したものは、実際に利用可能です。なぜなら、関数テンプレートのパラメータをデフォルトにすることができなくなる前に、C++ 11以降... –

+0

右。クイックアンサーは悪い考えです。私は間違った情報を与えた。これは私の教訓です。 –

+0

あなたの答えを改善するための教訓を与えることは、コメントしていません... –

2

std::enable_if<>は有効なタイプです。

template<typename T> 
typename std::enable_if<is_ring_field<T>::value,int>::type RankMat(T const& Input) 
{ 
    return 10; 
} 

template<typename T> 
typename std::enable_if<(not is_ring_field<T>::value),int>::type RankMat(T const& Input) 
{ 
    return 20; 
} 
関連する問題