私はopencascade C++のC#へのラッパーを開発しています。 私のC++は、ここ数年、主にC#で作業していたので少し錆びました。複雑なC++テンプレートコード
今、私は次のような問題が発生したことだし、それを修正する方法を見つけ出すことができませんでした:
#include <type_traits>
//! Trait yielding true if class T1 is base of T2 but not the same
template <class T1, class T2, class Dummy = void>
struct is_base_but_not_same : std::is_base_of <T1, T2> {};
//! Explicit specialization of is_base_of trait to workaround the
//! requirement of type to be complete when T1 and T2 are the same.
template <class T1, class T2>
struct is_base_but_not_same <T1, T2, typename std::enable_if <std::is_same <T1, T2>::value>::type> : std::false_type {};
template <class T>
class handle
{
public:
//! Down casting operator from handle to base type
template <class T2>
static typename std::enable_if<is_base_but_not_same<T2, T>::value, handle>::type
DownCast(const handle<T2>& theObject)
{
return handle(dynamic_cast<T*>(const_cast<T2*>(theObject.get())));
}
//! Down casting operator from pointer to base type
template <class T2>
static typename std::enable_if<is_base_but_not_same<T2, T>::value, handle>::type
DownCast(const T2* thePtr)
{
return handle(dynamic_cast<T*>(const_cast<T2*>(thePtr)));
}
};
class Foo
{
};
typedef handle<Foo> Handle_Foo;
Handle_Foo DownCastFoo(Handle_Foo const &T) {
return Handle_Foo::DownCast(T);
}
compilorエラーは次のとおりです。
Error C2672 'handle<Foo>::DownCast': no matching overloaded function found
Severity Code Description Project File Line Suppression State
Error C2784 'std::enable_if<is_base_but_not_same<T2,T,void>::value,handle<T>>::type handle<T>::DownCast(const T2 *)': could not deduce template argument for 'const T2 *' from 'const Handle_Foo'
Severity Code Description Project File Line Suppression State
Error C2893 Failed to specialize function template 'std::enable_if<is_base_but_not_same<T2,T,void>::value,handle<T>>::type handle<T>::DownCast(const handle<T2> &)'
誰も私を指すことができます正しい方向に?
こんにちは、私はこれらのコードの定義が完了していると思います。 –
あなたが投稿したコードに少なくとも1つのタイプミスがあります。 [mcve]を作成します。それをコンパイルします。修正したいエラーを正確に取得します。別のエラーが発生した場合は、mcveを修正してください。手書きでは転載しないでください。コードを(コピー貼り付けで)コピーし、スペースでフォーマットし、(コピー貼り付けで)エラーをコピーし、スペースでフォーマットします。エラーを要約したり、すべての警告とエラー行を含めたりしないでください。誰かに誤字があり、実際のエラーは何かを理解するように頼むことは、受け入れられない、良い、悪くない、そして一般的に良くないことです。あなたの例が長すぎる場合は、最小限に抑えてください。 – Yakk
第3回は彼らが言っている魅力です;) –