Compilers sometimes produce wonky error messages for array types.
Here's an accumulation of previous answers into a paste-and-compile program.
#include <string>
#include <iostream>
#if 1
int main(int argc, char **argv)
{
    using std::cout;
    using std::endl;
    char msg[1000] = {0};    // initialize to 0 here since we're printing below
                            // the <type> <array-name>[<size>] = {0} just fills a POD struct or an array with 0s
    std::string mystr = "hello";
    // if, at some point, you have things changing "mystr"
    // you'll need to make sure that it will fit in msg[]
    cout << "Before strcpy: \"" << msg << "\"" << endl;
    // I'll just finish the statement in mystr...
    mystr += " world!";
    if(mystr.length() < sizeof(msg)){
        strcpy(
            msg,            // <- put in here until we find a '\0'
            mystr.c_str()    // <- take from here (which could be a temporary buffer)
            );
    }
    //MSC will complain about strcpy being unsafe
    //
    // you can use the below instead (if you really feel the need to), which is
    // the MS-specific equivalent to the above.
    /*
        strcpy_s(
            msg,            // <- put in here until we find a '\0' or the size limit is reached
            sizeof(msg),    // <- don't put any more than this many chars in msg
            mystr.c_str()    // <- take from here
            );
    */
    cout << "After strcpy: \"" << msg << "\"" << endl;
    return 0;
}
#else
// Similarly, using wchar_t (a usually non-byte-sized character type)
//
// note where the divisions occurr
int main(int argc, char **argv)
{
    using std::wcout;
    using std::endl;
    wchar_t msg[1000] = {0};
    std::wstring mystr = L"hello";
    wcout << "Before strcpy: \"" << msg << "\"" << endl;
    mystr += L" world";
    if(mystr.length() < (sizeof(msg)/sizeof(wchar_t))){
        // mystr wil fit!
        wcscpy(
            msg,            // <- put in here until we find a '\0'
            mystr.c_str()    // <- take from here (which could be a temporary buffer)
            );
    }
    // Similar to the char case in the first preprocessor block
    /*
        wcscpy_s(
            msg,                            // <- put in here until we find a '\0' or the size limit is reached
            sizeof(msg)/sizeof(wchar_t),    // <- don't put any more than this many wchar_ts in msg
            mystr.c_str()                    // <- take from here
            );
    */
    wcout << "After strcpy: \"" << msg << "\"" << endl;
    return 0;
}
#endif
I shall leave it to you to read the documentation on all related functions.