0

私はstackoverflowの質問からこのコードを持っています:

template <typename K, typename V>
bool   exists_in(std::map<K,V> const& haystack, K const& needle) 
{
   return haystack.find(needle) != haystack.end();
}

テンプレートの新しいユーザーである私は、ここで何が起こっているのかを今でも理解しています。ただ、当てはまらないようです。

私は定義しました

class     Varinfo;                            // meta information about vars
std::map<std::string,VarInfo*>    g_varMap;   // a map between var names and meta-info

私のメインのC++コードには、次のステートメントがあります。

// various other uses of g_varMap that don't cause errors then

if ( exists_in( g_VarMap, "fred" ) )

このエラーが発生します。

undefined reference to `bool exists_in<std::basic_string<char, 
std::char_traits<char>, std::allocator<char> >, 
VarInfo*>(std::map<std::basic_string<char, std::char_traits<char>, 
std::allocator<char> >, VarInfo*, std::less<std::basic_string<char, 
std::char_traits<char>, std::allocator<char> > >, 
std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, 
std::allocator<char> > const, VarInfo*> > > const&, std::basic_string<char, 
std::char_traits<char>, std::allocator<char> > const&)'

私は完全に理解していません。

なぜこれが不平を言っているのか誰かに教えてもらえますか?テンプレートに関する知識が不足していますか?std :: string( "fred")を含むexists_in()によって返され、送信される変数に対してさまざまなキャスト操作を試しました。何も役に立たなかった。さらに意味のないエラーを生成したものもあります。

4

2 に答える 2

2

未定義の参照は、オブジェクトファイルで定義が見つからないことを意味します。これはリンカーエラーです。テンプレートメソッドは、個別のcppファイルではなく、ヘッダーファイル内で定義する必要があります。

あなたのコードは大丈夫に見えます、私は大まかな概算をしました、あなたはそれをここで見ることができます:http: //codepad.org/UvgeTIoC

于 2012-08-27T20:25:24.213 に答える
2

呼び出しポイントの前に関数が使用可能であった場合、問題はありません。これはテンプレートコードであるため、完全な実装を直接または間接的に含める必要があることに注意してください。

#include <map>
#include <iostream>

template <typename K, typename V>
bool   exists_in(std::map<K,V> const& haystack, K const& needle) 
{
   return haystack.find(needle) != haystack.end();
}

int main()
{
  std::map<int, int> m{{1,1},{2,2}};
  std::cout << std::boolalpha;
  std::cout << exists_in(m,2) << "\n";
}

出力true

于 2012-08-27T20:27:07.787 に答える