Hallo Ich versuche, ein Objekt des Typs T zu erstellen, wobei T ein Zeiger ist über die Verwendung von T Ergebnis = T(). Aber anstatt den Konstruktor aufzurufen, gibt es einfach einen Nullzeiger zurück. HierWie Vorlageobjekt des Typs T ordnungsgemäß zu erstellen ist, d. H. T result = T();
ist ein Beispiel für einige betroffene Code:
template <class T>
T readBlockchain(std::ifstream* stream) {
T result = T(); // Result is null after this
decltype(result->getLastBlock()) blkPtr = result->getLastBlock();
auto blk = *blkPtr;
decltype(result->getLastBlock()) lastBlock = &readBlock<decltype(blk)>(stream);
if(!lastBlock->verify())
return nullptr;
unsigned long count = *readUnsignedLong(stream);
unsigned long orphanCount = *readUnsignedLong(stream);
std::map<std::string, decltype(blk)> blocks = std::map<std::string, decltype(blk)>();
for(int i = 0; i < count - 1; i++){
decltype(blk) block = readBlock<decltype(blk)>(stream);
if(!block.verify())
return nullptr;
blocks.insert(std::make_pair(block.getHash(), block));
}
std::vector<Blockchain<decltype(blk)>*> orphanedChains = std::vector<Blockchain<decltype(blk)>*>();
for(int i = 0; i < orphanCount - 1; i++){
Blockchain<decltype(blk)>* orphan = &readOrphanedChain<Blockchain<decltype(blk)>>(stream);
orphanedChains.push_back(orphan);
}
result->setLastBlock(lastBlock);
result->setCount(count);
result->setOrphanCount(orphanCount);
result->setBlocks(blocks);
result->setOrphanedChains(orphanedChains);
return result;
}
Was ist 'T'? Wenn "T" ein Zeiger auf etwas ist, erzeugt "T()' default - einen Zeiger, der zu einem "nullptr" führt. Verwenden Sie so etwas wie 'using S = std :: decay_t; T Ergebnis = neues S; '. –
JohnB
Ja T ist ein Zeiger, ich werde die Frage editieren –
Warum templatisieren Sie Ihre Methode nicht auf den Typ, auf den der Zeiger zeigt, und geben ein 'T *' zurück? Das wäre transparenter. 'Vorlage T * readBlockchain (...) {T * Ergebnis = neu T; ...} '. Oder, noch besser, erstelle und gebe ein 'std :: unique_ptr ' zurück. –
JohnB