The code posted is not the code compiled ("#include fuiture>" won't parse).
The message you posted is from the compiler, not from the linker, and it's telling you that the first argument to the thread constructor, &func, cannot be called with the second argument to the thread constructor, val, as a parameter. &func is a pointer to function that takes two parameters, but you're trying to call it with one.
You can make your program work by changing just one line:
// std::thread t(&func, val );
std::thread t(&func, std::move(p), val );