私は、転送コンストラクタを使って薄い派生クラスを作っていました。 (私と一緒にいて、継承されたコンストラクタがないGCC 4.7.2を使う必要があります)。この演算子はなぜ曖昧な呼び出しですか?
最初の試行では、explicit
というキーワードを追加するのを忘れてしまい、エラーが発生しました。誰かがこの特定のエラーがなぜ発生するのか正確に説明できますか?私はイベントのシーケンスを理解するのに問題があります。
#include <memory>
template<typename T>
struct shared_ptr : std::shared_ptr<T>
{
template<typename...Args>
/*explicit*/ shared_ptr(Args &&... args)
: std::shared_ptr<T>(std::forward<Args>(args)...)
{}
};
struct A {};
struct ConvertsToPtr
{
shared_ptr<A> ptr = shared_ptr<A>(new A());
operator shared_ptr<A> const &() const { return ptr; }
};
int main()
{
shared_ptr<A> ptr;
ptr = ConvertsToPtr(); // error here
return 0;
}
エラー:
test.cpp: In function ‘int main()’:
test.cpp:28:23: error: ambiguous overload for ‘operator=’ in ‘ptr = ConvertsToPtr()’
test.cpp:28:23: note: candidates are:
test.cpp:9:8: note: shared_ptr<A>& shared_ptr<A>::operator=(const shared_ptr<A>&)
test.cpp:9:8: note: shared_ptr<A>& shared_ptr<A>::operator=(shared_ptr<A>&&)
GCC 5+で受け入れられ、4.9およびClangによって拒否されました。 –
このエラーが発生する理由は次の通りです:* ConvertsToPtrの変換関数の結果からの 'const shared_ptr &'コンストラクタと、 'shared_ptr'からの' shared_ptr && 'コンストラクタのいずれかです 'は' Args = {ConvertsToPtr} 'から構成されています。しかし、それらが同等に良いことを意図しているかどうかはわかりません。 –
@ Alf meh。 my_namespace :: shared_ptrとstd :: shared_ptrは異なる名前です。 – AndyJost