2017-01-09 18 views
1

私は、ベクトルの要素をコンマで区切られた文字列に変換する関数を持っています。私は、この関数がint、floatまたはdoubleなどとして数値の仕事をしたいので、私はテンプレートのベクトルを受信する機能を作っています同じタイプ間で無効な変換

template <typename T> 
std::string ConvertToString(std::vector<T> elements) 
{ 
    std::stringstream stream; 
    for(int i = 0; i < elements.size()-1; i++) 
    { 
     stream << elements[i]; 
     stream << ","; 
    } 
    stream <<elements[elements.size()-1]; 
    return stream.str(); 
} 

は、その後、私は宣言すると、ベクターを移入:

std::vector<int> values; 
values.push_back(1); 
values.push_back(2); 
values.push_back(3); 

と機能呼び出そう:

:私は次のエラーを受け取る上記の関数ラインの呼び出しで今

std::string convertedString = ConvertToString(values); 

エラーC2664: 'ConvertToString':からパラメータ1を変換することはできません 'のstd ::ベクトル< _Ty>' から 'のstd ::ベクトル< _Ty>'

私はこれを取得なぜ私は理解していません上記のタイプは同じであるため、エラーが発生します。誰かが私が間違っているところを教えてもらえますか?どのようにして関数呼び出しを動作させることができますか?

ありがとうございました!

編集:

私は、Visual Studioに2012

を使用しています私の完全なコードはこれです:

#include<string> 
#include<iostream> 
#include<sstream> 
#include<vector> 

std::string ConvertToString(std::vector<std::string> strings); 

int __cdecl main(int argc, char **argv) 
{ 
    std::vector<int> values; 
    values.push_back(1); 
    values.push_back(2); 
    values.push_back(3); 
    values.push_back(4); 
    values.push_back(5); 

    std::string convertedValues = ConvertToString(values); //here the error occurs 

    return 0; 
} 

template <typename T> 
std::string ConvertToString(const std::vector<T> elements) 
{ 
    std::stringstream stream; 
    for(int i = 0; i < elements.size()-1; i++) 
    { 
     stream << elements[i]; 
     stream << ","; 
    } 
    stream <<elements[elements.size()-1]; 
    return stream.str(); 
} 
+0

(HTTP [再現することはできません]/ideone。com/igVWQS)を投稿したもの(少なくともg ++で)...もう少し表示する必要があります(使用しているVSのバージョンを教えてください)。 – Holt

+5

VS2015、VS2013、VS2005で再現できません。 – Danh

+0

@Holtコード全体を更新しましたが、まだ間違っています。 – meJustAndrew

答えて

4

あなたがこれを書く:

std::string ConvertToString(std::vector<std::string> strings); 

... main前に、あなたはstd::vector<std::string>を取り、std::stringを返す機能ConvertToStringを宣言しているので、あなたはstd::vector<int>それでmain内で呼び出すしようとすると、明らかに動作しません。

のテンプレートバージョンがmainにコンパイラで表示されないため、ConvertToString(std::vector<int>)を呼び出すことはできません。 ConvertToStringの最初の宣言を変更します。

template <typename T> 
std::string ConvertToString(const std::vector<T> elements); 

そして、すでに他の回答で述べたように、あなたはconst参照ではなく値で渡す必要があります:/:

template <typename T> 
std::string ConvertToString(std::vector<T> const& elements); 
+0

あなたは正しいです、私はこれを逃しました:) – meJustAndrew

0

これは、有効なC++ 03であるので、コンパイラのバグがありますか、おそらく(私は敢えて)、不正な例です。 (int main()の例を作成し、コンパイラベンダーに提出することを検討してください)。

幸運なことに、とにかくはるかに良い回避策が用意されています。すなわち、また、ベクターのディープコピーをなくすであろうconst参照によってパラメータを渡す

template <typename T> std::string ConvertToString(const std::vector<T>& elements)

を書きます。

関連する問題