THIS DOESN'T WORK: undefined reference to `int asd(int*)' #include #include using namespace std; template ::value, int >::type =0 > int asd(T*){ cout<<"This is for arrays"<::value, int >::type =0 > int asd(T*){ cout<<"This is for NON arrays"<; voided(&dummy); } THIS DOES: #include #include using namespace std; template ::value, int >::type =0 > int asd(T*){ cout<<"This is for arrays"<::value, int >::type =0 > int asd(T*){ cout<<"This is for NON arrays"<; int (*voided)(void*)=(int (*)(void*))temp; voided(&dummy); }