Your `Vector`

class has two constructor: a template one (intended for values) and the default copy constructor.

Problem: the copy constructor is preferred but only if there is an exact match.

So, initializing `b`

with `a`

```
mu::Vector<2, int> a{1, 2};
mu::Vector<2, int> b{a};
```

the copy constructor is preferred because `a`

is an exact match

But, initializing `h`

with `g`

```
mu::Vector2D<int> g{1, 2};
mu::Vector<2, int> h{g};
```

`g`

can be converted to a `mu::Vector<2, int>`

but **isn’t** an exact match, so the template constructor is preferred but the template constructor is incompatible.

A possible solution: SFINAE disable the template constructor when the there is only one argument and the argument is derived from `mu::Vector`

.

For example

```
template <typename... TArgs,
typename std::enable_if_t<sizeof...(TArgs) == N
or (not std::is_base_of_v<Vector, TArgs> && ...), int> = 0>
Vector(TArgs const & ... args) : data({args...}) {}
```

CLICK HERE to find out more related problems solutions.