Question: ```
template <class T1, class T2>
class A {};

template <class T1>
class A {};

A<int, int> a;
A<int> b;

```

This code generates 

> 
> error C2976: 'A' : too few template arguments
> 
> 
> 

at the second diclaration of 'A' class.

Answer: 
There is no SFINAE going on here. You are redeclaring the class `A`, originally with 2 template parameters, to another one with only 1 template parameters, and hence the error. g++ gives a more explicit error:

> 
> error: redeclared with 1 template parameter class A {};
> 
> 
> note: previous declaration 'template class A' used 2 template parameters
> 
> 
>
SFINAE is about a **substitution failure**; i.e. the problem must be a consequence of what types you are placing as template parameters. Not every error qualifies... as an extreme example consider

```
template<T>
struct foo {
    !@#*&!%^@
};

```

this is also an error, but not a substitution failure :-)