#include <memory>
template <typename Op, typename T>
struct base { };
template <typename Mode, typename T>
struct derived { };
template <typename T>
struct derived<int, T> : public base<int, T> { };
template <typename D, typename T>
void fun(std::unique_ptr<base<D, T>>) { }
int main() {
auto d = std::make_unique<derived<int, double>>();
fun(std::move(d));
}
I2luY2x1ZGUgPG1lbW9yeT4KCnRlbXBsYXRlIDx0eXBlbmFtZSBPcCwgdHlwZW5hbWUgVD4Kc3RydWN0IGJhc2UgeyB9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIE1vZGUsIHR5cGVuYW1lIFQ+CnN0cnVjdCBkZXJpdmVkIHsgfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgZGVyaXZlZDxpbnQsIFQ+IDogcHVibGljIGJhc2U8aW50LCBUPiB7IH07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgRCwgdHlwZW5hbWUgVD4Kdm9pZCBmdW4oc3RkOjp1bmlxdWVfcHRyPGJhc2U8RCwgVD4+KSB7IH0KCmludCBtYWluKCkgewoJYXV0byBkID0gc3RkOjptYWtlX3VuaXF1ZTxkZXJpdmVkPGludCwgZG91YmxlPj4oKTsKCWZ1bihzdGQ6Om1vdmUoZCkpOwp9
prog.cpp: In function 'int main()':
prog.cpp:17:18: error: no matching function for call to 'fun(std::remove_reference<std::unique_ptr<derived<int, double>, std::default_delete<derived<int, double> > >&>::type)'
fun(std::move(d));
^
prog.cpp:17:18: note: candidate is:
prog.cpp:13:6: note: template<class D, class T> void fun(std::unique_ptr<base<D, T> >)
void fun(std::unique_ptr<base<D, T>>) { }
^
prog.cpp:13:6: note: template argument deduction/substitution failed:
prog.cpp:17:18: note: mismatched types 'base<D, T>' and 'derived<int, double>'
fun(std::move(d));
^
prog.cpp:17:18: note: 'std::unique_ptr<derived<int, double>, std::default_delete<derived<int, double> > >' is not derived from 'std::unique_ptr<base<D, T> >'