こんにちは、私はタイプTのオブジェクトを作成しようとしています。ここで、TはT result = T()を使ってポインタです。しかし、コンストラクタを呼び出す代わりに、単にnullポインタを返します。私の理解が正しければタイプTのテンプレートオブジェクト、つまりT result = T()を正しく作成する方法。
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;
}
'T'とは何ですか? 'T 'が何かへのポインタである場合、' T() 'はデフォルトでポインタを作成し、' nullptr'を返します。 'S = std :: decay_tを使用するようなものを使用してください。; T結果=新しいS; '。 –
JohnB
はいTはポインタです、私は質問を編集します –
ポインタが指し示すタイプであなたのメソッドをテンプレート化して 'T *'を返さないのはなぜですか?それはより透明になります。 'テンプレート T * readBlockchain(...){T * result = new T; ...} '。あるいは、さらに良い方法は、 'std :: unique_ptr 'を作成して返すことです。 –
JohnB