Matrix is a function, so you need to pass arguments to it. The name "Matrix" by itself is just a pointer to a function. Also, the function returns void, so even if it were called correctly, there is no return value that can be used in a multiplication.
There is no std::vector< std::vector< int> > in your Decode function that can be used as an argument to Matrix. The argument name nbits (to the Matrix function) hides the constexpr of the same name earlier in the file.
3 % std::numeric_limits<unsignedlonglong>::digits; is going to evaluate to 3.
A couple of times in your post you refer to "matrix" (lower case), but that token does not show up in your code snippets. It is very difficult to understand what you are asking.