2016-04-13 11 views
0

ここでいくつかの明確化のために願っています。以下のコードは正常に実行されますが、else文のコメントを外すとコンパイルエラーが発生します。 mainにタイプstringの可能性がありますが、タイプintを指定しているためです。実際のコードを次のように簡略化して問題を絞り込んでいますが、mainのベクトルdataは、getNextLineOfDataが返すどのようなタイプのものでもかまいません。テンプレート関数からのベクトルを返す

#include <vector> 
using namespace std; 

template< typename T> 
std::vector<T> getNextLineOfData(bool someBoolean) 
    { 
     std::vector<T> data; 
     if (someBoolean) 
     { 
      data.push_back(1); 
      data.push_back(2); 
      data.push_back(3); 
     } 
     /* 
     else 
     { 
      data.push_back("1"); 
      data.push_back("2"); 
      data.push_back("3"); 
     } 
     */ 
return data; 
    }; 

int main() 
{ 
vector<int> data = getNextLineOfData<int>(true); 
return 0; 
} 
+1

決定させるために多くの方が良いでしょう。 'string'と' int'sの両方をその中に押し込むことはできません。 – BoBTFish

+1

「int」から変換される手段がないかもしれないので、このようなことはできないと思います。テンプレートの特殊化を使用して、選択した特定のタイプをサポートすることができます。 – MikeCAT

+0

他の人が指摘しているように、配列内にデータ型を混在させることはできません。達成したいのは何ですか? – pingul

答えて

-1

コードスニペットで実行時操作とコンパイル時操作が混同されています。関数getNextLineOfDataをテンプレート化してgetNextLineOfData<int>でインスタンス化すると、コンパイラは先に進み、ベクトルを返す関数を生成します。ただし、if文は実行時にのみ評価されます。だから、コンパイラがあなたのコードを構築しようとすると、条件付きでコンテナにvector<int>コンテナに1"1"を追加することになります。これは許可されていません。 テンプレートの特殊化で問題を解決できます。

#include <vector> 

using namespace std; 

template<typename T> 
std::vector<T> getNextLineOfData() { 
    // default 
} 

template<> 
std::vector<int> getNextLineOfData() 
    { 
     std::vector<int> data; 

      data.push_back(1); 
      data.push_back(2); 
      data.push_back(3); 

      return data; 
    }; 

template<> 
std::vector<std::string> getNextLineOfData() 
    { 
     std::vector<std::string> data; 

      data.push_back("1"); 
      data.push_back("2"); 
      data.push_back("3"); 

      return data; 
    }; 
int main() 
{ 
    vector<int> data = getNextLineOfData<int>(); 
    return 0; 
} 

EDIT:@BobTFishが指摘するように、機能ではなく、テンプレート、それを専門に過負荷をかけた方が良いかもしれません。上記のソリューションは、最初に設定した方法で問題を解決します。

void getNextLine(std::vector<std::string>& output) 
{ 
    output.push_back("string data as you please"); 
} 

void getNextLine(std::vector<int>& output) 
{ 
    output.push_back(1); 
} 

bool nextLineIsIntData() 
{ 
    // somehow determine if the coming data is strings or ints 
    return false; 
} 

int main() 
{ 
    std::vector<std::string> stringData; 
    std::vector<int> intData; 
    if (nextLineIsIntData()) 
     getNextLine(intData); 
    else 
     getNextLine(stringData); 
    // do whatever you want 
} 
+1

まず、特殊化する前にテンプレートを宣言する必要があります。 *](http://www.gotw.ca/publications/mill17.htm)。 – BoBTFish

-1

コメントに余分な情報から読むと、私のようなものをお勧めします。いくつかの条件がよりも真である場合ときあなたが言うif-else声明で見て、よくこのはこのがないので、それはあまりにもコンパイラが実行されていない部分を無視することを理由立って実行しますがます。これは間違っています。以前の回答にレイアウトされている必要があるのは、異なるデータタイプの関数があまりにも多くオーバーロードされているか、特殊化されているためです。

また、さんとお伝えいただきたいことは、に行ってみてください。あなたは本質的に正しいbool値を渡すユーザーに頼っているので、push_back()のベクトルに影響します。あなたが正しいテンプレート入力の頼りにする必要性を完全に取り除く、あなたの処分でテンプレートパターンマッチングの力を持っているとき、これをなぜ行うのですか?

は、この場合、あなたが遭遇して任意の類似したものでは、コンパイラは `のstd :: vector`は一度に1種類を含むことができます

-1

は、さてあなたは何をしているか、単に違法です:

関連する問題