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&)'

我完全不明白。

有人能告诉我为什么这是抱怨吗?我缺少什么模板知识?我已经尝试了对返回并发送到 exists_in() 的变量的各种转换操作,包括 std::string("fred")。没有任何帮助。有些只是产生了更多无意义的错误。

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 回答