You are declaring `norm()`

as a `friend`

function, so it is not actually a member of the `vector`

class itself. You are telling the compiler that some external *non-member* function `T norm()`

is a *friend* of `vector`

so that it can access `vector`

‘s private members. But then you don’t actually define such a `T norm()`

function!

The correct way to implement `norm()`

as a member, with a definition outside of the class declaration, would look like this instead:

```
template <typename T>
class vector{
...
public:
...
T norm(); // <-- remove 'friend'!
};
template <typename T>
T vector<T>::norm(){ // <-- note the extra <T>!
T sum{0};
for (auto i = 0u; i < _size; ++i){
sum += elem[i];
}
return std::sqrt(sum);
}
```

On a side note:

You might consider using SFINAE to omit the declaration+definition of `norm()`

for `T`

types that `std::sqrt()`

does not support (non-integers/floating-point types, like strings, etc).

Also, your `vector`

class does not implement the Rule of 3/5/0 to manage its inner array properly. You need to add proper copy/move constructors and copy/move assignment operators to it.

CLICK HERE to find out more related problems solutions.