あいまいなコール:フォワードenable_ifを使用する関数を宣言
-
19-09-2019 - |
質問
私はいくつかのトラブル前方 boost::enable_if
を使用する関数を宣言していますの:次のコードは、私のコンパイラエラーを与えます:
// Declaration
template <typename T>
void foo(T t);
// Definition
template <typename T>
typename boost::enable_if<boost::is_same<T, int> >::type foo(T t)
{
}
int main()
{
foo(12);
return 0;
}
コンパイルするとき、私は「あいまいな呼び出しfooへの」エラーが発生します。 enable_if
の定義によれば、条件が真であるときに限り、私は見ることができるように、void
に対応typedefの「タイプ」、foo
マッチの2人の署名。なぜコンパイラは、彼らが異なっていると思うし、(好ましくはfoo
の一部を繰り返すことなく)enable_if
を宣言転送する正しい方法はありますでしょうか?
解決
これはenable_ifの唯一の問題ではありません。次のコードでのVisual Studioとgccで同じエラーを取得します:
struct TypeVoid {
typedef void type;
};
template<typename T>
void f();
template<typename T>
typename T::type f() {
}
int main()
{
f<TypeVoid>();
return 0;
}
私は、主な問題は、(インスタンス化の前に)戻り値の型はテンプレート関数の署名の一部であるということだと思います。ここのより多くの情報のがあります。
宣言は定義を参照する場合、あなたのコードについて、あなたは両方と一致する必要があります:
// Declaration
template <typename T>
typename boost::enable_if<boost::is_same<T, int> >::type foo(T t);
// Definition
template <typename T>
typename boost::enable_if<boost::is_same<T, int> >::type foo(T t)
{
}
宣言は異なる機能を参照している場合は、それらの両方が有効であるため、、コンパイラは、のint型のsのための正しいものを選択することはできないだろう。
:しかし、あなたは、のint型のsの使用のdisable_if のために最初のものを無効にすることができます// Other function declaration
template <typename T>
typename boost::disable_if<boost::is_same<T, int> >::type foo(T t);
// Defition
template <typename T>
typename boost::enable_if<boost::is_same<T, int> >::type foo(T t)
{
}
他のヒント
問題は、宣言と定義が一致していないということです。
この溶液を宣言は全く同じシグネチャ、およびenable_if
ビットを含むべきであるということである。
#include <boost/type_traits/is_same.hpp>
#include <boost/utility/enable_if.hpp>
// Declaration
template <typename T>
typename boost::enable_if<boost::is_same<T, int> >::type foo(T t);
// Definition
template <typename T>
typename boost::enable_if<boost::is_same<T, int> >::type foo(T t)
{
}
int main()
{
foo(12);
return 0;
}
これは、VC2008の罰金コンパイルします。
所属していません StackOverflow