:C++なしマッチング関数テンプレートを使用して、リンカエラー
template<typename T>
T getRandomItem(vector<T> items){
if(items.isEmpty()) return nullptr;
int i = random(0, (int) items.size() - 1);
return items.at(i);
}
それは単にベクトルからランダムインデックスを取得し、その位置にある項目を返します。
私は最初の例をお見せしましょう:
vector<string> v = {"foo", "bar"};
string item = getRandomItem(v);
コンパイラは、ここで間違って何も表示されませんが、私は非常に奇妙なリンカエラーを取得しています:
Undefined symbols for architecture armv7:
"std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > getRandomItem<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >)", referenced from:
はまた、これはさえませんコンパイラを渡す:
auto v = {"foo", "bar"};
string item = getRandomItem(v);
私は次のエラーを取得しています:
No matching function for call to 'getRandomItem'
私はインラインそれを使用したい場合にも、それは動作しません。
string item = getRandomItem({"foo", "bar"});
私はこのようなパラメータの前に追加してみました:
string item = getRandomItem<string>({"foo", "bar"});
しかし、私は取得しています別のコンパイラエラー:
リンカエラーを修正するにはどうすればよいですか?ベクトルインラインでコードを変更するにはどうすればよいですか?
編集: この例はxcode 8.2.1でコンパイルされています。ランダム関数はcocos2d-xライブラリから(重要であれば)です。
EDIT2:テンプレートコードを除去した後 はコンパイル開始しました:
string getRandomItem(vector<string> items){
if(items.size() == 0) return nullptr;
int i = random(0, (int) items.size() - 1);
return items.at(i);
}
また、私は今、この行うことができます。
string item = getRandomItem({"foo", "bar"});
をので、主な疑問が残る:Xcodeのコンパイラは私がすることはできません理由ここでテンプレートを使用しますか?
を参照してくださいあなたのビルドコマンド(コンパイルとリンク)を表示します。また、エラーメッセージをカットしないでください。また、 'v'が' auto v = {"foo"、 "bar"};になりたいのはなぜでしょうか? –
おそらく[関連](http://stackoverflow.com/questions/6429494/undefined-symbols-for-architecture-armv7)? – George
'{" foo "、" bar "}'はベクトルではありません。インラインのようなものを渡すには、['std :: vector'コンストラクタ](http://en.cppreference.com/w/cpp/container/vector/vector)を見てください。コピーマネージャに注意を払わず、他のすべてを見てください( '{" foo "、" bar "}はベクトルではありません)。興味深いものを見ますか? –