J'ai une classe avec une liste d'initialisation dans le constructeur où l'un des champs que j'initialise est un fichier std::filesystem::path
mais il ne semble pas s'initialiser à la valeur attendue.
MyClass::MyClass(
unsigned int deviceSerial,
const std::string& processName
) :
deviceSerial(deviceSerial),
processName(processName),
configFilePath(GetBasePath() / std::to_string(deviceSerial) / ("#" + processName + ".json"))
{
/* Parameter checks */
}
En utilisant le débogueur, je peux voir que GetBasePath()
renvoie exactement ce que j'attends (renvoie std::filesystem::path
avec le chemin correct) mais le /
L'opérateur ne semble pas avoir d'effet. Une fois dans le corps du constructeur, je peux voir que configFilePath
est réglé sur le résultat de GetBasePath()
sans les informations supplémentaires ajoutées.
J'utilise MSVS-2019, la norme de langage C++ est définie sur C++17 et, en mode débogage, toutes les optimisations sont désactivées.
J'ai également testé ce qui suit dans le corps de la classe et je vois toujours path
comme étant simplement le résultat de GetBasePath()
et les éléments supplémentaires ne sont pas ajoutés.
{
auto path = GetBasePath(); // path = "C:/Users/Me/Desktop/Devices"
path /= std::to_string(deviceSerial); // path = "C:/Users/Me/Desktop/Devices"
path /= ("#" + processName + ".json"); // path = "C:/Users/Me/Desktop/Devices"
}
En passant, j'ai aussi essayé le test ci-dessus avec +=
au lieu de /=
et je vois toujours les mêmes résultats.
Modifier
Comme demandé, vous trouverez ci-dessous un exemple minimal complet et vérifiable.
#include <Windows.h>
#include <cstdio>
#include <filesystem>
#include <memory>
#include <string>
std::string ExpandPath(const std::string &str) {
auto reqBufferLen = ExpandEnvironmentStrings(str.c_str(), nullptr, 0);
if (reqBufferLen == 0) {
throw std::system_error((int)GetLastError(), std::system_category(),
"ExpandEnvironmentStrings() failed.");
}
auto buffer = std::make_unique<char[]>(reqBufferLen);
auto setBufferLen =
ExpandEnvironmentStrings(str.c_str(), buffer.get(), reqBufferLen);
if (setBufferLen != reqBufferLen - 1) {
throw std::system_error((int)GetLastError(), std::system_category(),
"ExpandEnvironmentStrings() failed.");
}
return std::string{buffer.get(), setBufferLen};
}
int main() {
unsigned int serial = 12345;
std::string procName = "Bake";
std::filesystem::path p(ExpandPath("%USERPROFILE%\\Desktop\\Devices"));
std::printf("Path = %s\n", p.string().c_str());
// p = C:\Users\Me\Desktop\Devices
p /= std::to_string(serial);
std::printf("Path = %s\n", p.string().c_str());
// p = C:\Users\Me\Desktop\Devices
p /= "#" + procName + ".json";
std::printf("Path = %s\n", p.string().c_str());
// p = C:\Users\Me\Desktop\Devices
std::getchar();
}
I've also used this example and tested with `p.append()` and got the same result.