Compiling the following contrived example:

```
class Base
{};

class Derived : public Base
{};

template< typename T >
class A
{};

class B
{
public:

    static void f( const A< Base >& ) {}
};

int main()
{
    A< Base > tb;
    A< Derived > td;

    B::f( tb );
    B::f( td );

    return 0;
}

```

using g++-8 gives me the following error:

```
error: no matching function for call to 'B::f(A<Derived>&)'
 B::f( td );
note:   no known conversion for argument 1 from 'A<Derived>' to 'const A<Base>&'

```

Why?

Since `Derived` *is-a* `Base` and it doesn't override any of `Base`'s stuff, why can't I give a `Derived` in the place of a `Base` in the templated function parameter?