A is not a class, but a class template. An instance of a class template is a class.
In this case, basic_istream is a class template, and istream is another name for an instance of the class template basic_istream named basic_istream<char>. Finally, cin is an object, an instance of the class istream.
1 2 3 4 5 6 7 8 9 10
// class template
template <typename T>
struct basic_istream : public basic_ios<T>
{ /* ... */ };
// class
using istream = basic_istream<char>;
// object
istream cin; // not actually this easy
The latter (the alias syntax) can also declare template names, and I don't have a problem getting the order (i.e., typedeforiginal_type new_name) mixed up.
@OP
Yes - you can explicitly instantiate a template.
I had to edit this post because I made a mistake. We can't explicitly instantiate std::vector<char>, because it's forbidden to instantiate templates from the standard namespace unless the declaration depends on at least one user-defined type. For example, std::vector<my_type> is okay.
You can instantiate it by doing this - just once: template class std::vector<my_type>;
And the corresponding declaration looks like this: extern template class std::vector<my_type>;
extern template class declares (but doesn't define) an explicit instantiation. But just template class both declares and defines an explicit instantiation.
The former is just a forward declaration. It says "this explicit instantiation is defined elsewhere" (e.g., in definition.cpp). This causes implicit instantiation of the declared class to be skipped, and makes the linker look for the missing code elsewhere.
You'd only declare an explicit instantiation to reduce duplicate work on the compiler's part, to speed up compilation.