Compiler Warning (level 3) C4686

'user-defined type' : possible change in behavior, change in UDT return calling convention


A class template specialization was not is defined before it was used in a return type. Anything that instantiates the class will resolve C4686; declaring an instance or accessing a member (C<int>::anything) are also options.

This warning is off by default. See Compiler Warnings That Are Off by Default for more information.


Try the following instead:

// C4686.cpp
// compile with: /W3
#pragma warning (default : 4686)
template <class T>
class C;

template <class T>
C<T> f(T);

template <class T>
class C {};

int main() {
   f(1);   // C4686

template <class T>
C<T> f(T) {
   return C<int>();