考えられるメソッドを削除するために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が失敗しました。
「RankMat」の2つのオーバーロードを確認してください。オーバーロードのどの部分が違うのですか?その部分を有効な過負荷と異なる機能の唯一の部分にすることはできますか? – NathanOliver
'typename std :: enable_if <*,*> :: type'を忘れていませんか? –
はい、私はメッセージを書いた後に気付きました。 clang ++とg ++の両方のメッセージは役に立たなかった。 –