Выражение должно иметь тип класса - PullRequest
0 голосов
/ 03 апреля 2020

Я сейчас программирую приложение для исправления для моей игры. Так как я привык программировать на Java, мне трудно ладить с C ++, к сожалению, патч должен быть расширен в C ++, в Java я мог бы сделать это за 5 минут, но на новом языке. , , не так много.

Это мой текущий код для создания нужных мне папок:

#include <windows.h>
#include <stdlib.h>
#include <iostream>

using namespace std;

int main(int argc, char* argv[])
{
    //Set the Strings the Patcher needs.
    string DNGDirectory = "C:\\dnGames";
    const char* DDDirectory = "C:\\dnGames\\DuelistsDance";

    //Create directories if they don't exist yet.
    if (CreateDirectory(DNGDirectory.c_str(), NULL) || ERROR_ALREADY_EXISTS == GetLastError())
    {
        if (CreateDirectory(DDDirectory.c_str(), NULL) || ERROR_ALREADY_EXISTS == GetLastError())
        {
            cout << "Directories successfully created." << std::endl;
        }
    }

    return 0;
}

Однажды я использую строку для переменной, потому что это было в примере кода, который я выбрал из Google ( Создайте каталог, если он не существует ), но я получаю сообщение об ошибке "Das Argument vom Typ" "const char " "ist mit dem Параметр vom Typ" "LPCWSTR" " inkompatibel «. (Должен быть аргумент типа "" const char"несовместим с параметром типа" "LPCWSTR" "в engli sh). Я попытался исправить это, используя" const char * "в качестве типа, но это выдает мне ошибку «Der Ausdruck muss einen Klassentyp aufweisen.» (У выражения должно быть тип класса). Кто-нибудь знает, как это исправить? Я использую Visual Studio 2019 для этого.

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

Начиная с C ++ 17 (и в меньшей степени 14) мы можем использовать std::filesystem (std::experimental::filesystem в C ++ 14) для манипулирования файлами и создания каталогов.

Например, в вашем случае :

...
std::filesystem::path DDDirectory("C:\\dnGames\\DuelistsDance"); 

try {
  std::filesystem::create_directories(DDDirectory); // Creates all the directories needed, like mkdir -p on linux

// Success here

} catch(std::filesystem::filesystem_error& e) {
  // Handle errors here
}

Это сделает обработку ваших ошибок более чистой и ваш кросс-платформенный код (хотя вам придется изменить путь, но std::filesystem::path превращает / в \\ при windows тем не мение). Это также делает ваш код легче для чтения и, как вы можете видеть, намного короче.

0 голосов
/ 03 апреля 2020

В случае, если кто-то прочитает это и столкнется с той же проблемой, это будет окончательное исправление:

  • изменить настройки проекта, чтобы больше не использовать юникод
  • изменить переменные на const char* DNGDirectory = "C:\\dnGames";
  • используйте CreateDirectory() и удалите .c_str() после имени переменной

Спасибо за комментарии и альтернативное решение с помощью std::filesystem!

...