2017-09-30 7 views
1

こんにちは、私はタイプ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; 
    } 
+2

'T'とは何ですか? 'T 'が何かへのポインタである場合、' T() 'はデフォルトでポインタを作成し、' nullptr'を返します。 'S = std :: decay_tを使用するようなものを使用してください。; T結果=新しいS; '。 – JohnB

+0

はいTはポインタです、私は質問を編集します –

+3

ポインタが指し示すタイプであなたのメソッドをテンプレート化して 'T *'を返さないのはなぜですか?それはより透明になります。 'テンプレート T * readBlockchain(...){T * result = new T; ...} '。あるいは、さらに良い方法は、 'std :: unique_ptr 'を作成して返すことです。 – JohnB

答えて

1

:ここ

は、いくつかの影響を受けるコードの例です。 を一般化するには、TがヒープにTという新しいオブジェクトを作成するポインタで、Tのコンストラクタを呼び出してTオブジェクトを作成する具体的なタイプの場合はTとします。 1つの解決方法は、以下の専門化構成を使用することです。ある

​​

、あなたはタイプT*のポインタのためのそのテンプレートクラスの専門と一緒にテンプレート引数Tをとり、テンプレートクラスを作成することができます。クラスTのコンストラクタを呼び出し、T*のヒープオブジェクトを作成する特殊化の内部で、Tタイプのオブジェクトを作成します(特殊化ではstd::unique_ptr<T*>を返すことに注意してください)。便利です)。

このように、あなたのreadBlockChainテンプレート関数になるでしょう:

template <class T> 
decltype(auto) readBlockchain(std::ifstream* stream) { 
    auto result = CreateNew<T>::apply(/* T constructor arguments */); 
    ... 
    return result; 
} 

Live Demo

+0

ありがとう、あとで試してみてください! –

+0

ありがとう、これはちょうど私が欲しかったように働いた! –

関連する問題