は、次のコードを考えてみましょう:変換演算子で使用すると、コンパイラはテンプレートパラメータを推測できないのはなぜですか?
#include <utility>
template<typename T>
struct wrapper {
T value;
};
struct foo {
operator wrapper<int>() {
return{10};
}
};
int main() {
foo f;
wrapper w = f; // error
std::pair p = std::make_pair(1, 0); // ok
}
gcc 7.1.1は、上記の標線でコンパイルに失敗します。
main.cpp: In function 'int main()': main.cpp:17:17: error: class template argument deduction failed: wrapper w = f; // error ^ main.cpp:17:17: error: no matching function for call to 'wrapper(foo&)' main.cpp:4:8: note: candidate: template<class T> wrapper(wrapper<T>)-> wrapper<T> struct wrapper { ^~~~~~~ main.cpp:4:8: note: template argument deduction/substitution failed: main.cpp:17:17: note: 'foo' is not derived from 'wrapper<T>' wrapper w = f; // error ^
f
wrapper<int>
に変換可能であるので、私はそれが起こることを期待しています。そこからコンパイラはT
がint
であると推測できるはずです。しかし、それはできません。
コンパイラは、std::pair
のテンプレートパラメータを正しく推定できます。なぜ、これがwrapper
の場合でないのですか?
アイデア?
IMOクラステンプレートの控除で変換演算子を調べると混乱します。それが必要な場合は、明示的な控除ガイドを使用する必要があります。 – cpplearner
関連:https://stackoverflow.com/q/43019240/1896169 – Justin
この '演算子の構造体ラッパー()'は何ですか? 'operator wrapper'または' operator() 'を宣言していますか? –
cat