for example:
// Example program
#include <iostream>
#include <string>
class abstract_class
{
public:
abstract_class() = default;
~abstract_class() = default;
virtual void read() = 0;
};
int main()
{
std::unique_ptr<abstract_class> x;
std::cout << "Hello, " << "!\n";
}
I thought an Abstract Class had these Restrictions
Abstract classes can't be used for:
Variables or member data
Argument types <---------
Function return types
Types of explicit conversions
In the above code we are using the abstract class as a template argument so why isnt this an error.
First things first, the argument types that you've mentioned in your question is for function call arguments and not for template arguments.
why isnt this an error.
Because you're creating a unique pointer to the abstract class object and not an object of the abstract class itself. That is, creating a pointer(whether unique or not) to a abstract class type is allowed.
For example, just think that you can also write the following without any error:
abstract_class *ptr; //this also works for the same reason