2012-08-27 53 views
0

我从stackoverflow question这段代码:使用模板

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”))的变量尝试了各种投射操作。没什么帮助。有些只是产生了更多无意义的错误。

+1

'exists_in <>'定义在哪里?定义需要对调用者可见。 – ildjarn

+0

您的错误是一个链接器错误,而不是编译器错误。 –

+0

我不喜欢模板。我会写:'template bool exists_in(Map const&m,typename Map :: key_type const&k){return m.find(k)!= m.end(); }' –

回答

2

未定义的引用意味着它无法在任何对象文件中找到该定义。这是一个链接器错误。您需要在头文件中定义模板方法,而不是在单独的cpp文件中。

您的代码看起来不错,我做了一个粗略的估计,你可以在这里看到:http://codepad.org/UvgeTIoC

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