http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58569
--- Comment #14 from Daniel Krügler <daniel.kruegler at googlemail dot com> --- (In reply to Jonathan Wakely from comment #13) > Argh, yes, I didn't read the diagnostic properly after that last change, > sorry! Thanks. I think the actual problem can be resolve by moving template<typename CallRes, typename Res1> struct CheckResult : is_convertible<CallRes, Res1> { }; out of the template. When this template is instantiated within the outer class, the result is still an incomplete type. I think there was a core issue with that out come.