[英]templated function with an argument that is a templated class
我意识到有很多类似的问题,但找不到解决我的问题的方法(请阅读:我并没有真正理解答案,因此无法将其应用于我的案例)
我有以下功能:
void printVariable(map<string, bool*>::iterator it)
{
cout << it->first << " " << *(it->second) << endl;
}
现在,如果我具有map<string, bool*> mapping
,则可以执行以下操作: printVariable(mapping.begin());
这行得通,现在我也有一个map<string, int*>
并希望能够做到这一点,所以我发现我更改了printVariable函数:
template <typename T>
void printVariable(map<string, T*>::iterator it)
{
cout << it->first << " " << *(it->second) << endl;
}
但是,这会产生编译错误(gcc):
error: variable or field 'printVariable' declared void
error: expected ')' before 'it'
我想我可以通过重载该功能来解决此问题。 但是我想知道为什么上面的方法不起作用。
Edit2:删除了声称正确解决方案的文本错误
您必须说出typename
才能消除从属名称的歧义:
template <typename T>
void printVariable(typename map<string, T*>::iterator it)
// ^^^^^^^^
但是,请注意,这不是可推论的上下文,因此这种形式并不是十分方便。
更好的是,只需将整个迭代器作为模板参数即可:
template <typename Iter>
void printVariable(Iter it)
{ /* ... */ }
这样,您还可以捕获具有非标准比较器或分配器的映射以及无序映射等。
这是一个简单的思想实验,用于说明为什么在第一种情况下没有可推论的上下文:在随后的foo
调用中应如何推论T
?
template <typename T> void foo(typename Bar<T>::type);
template <typename T> struct Bar { typedef char type; };
template <> struct Bar<int> { typedef int type; };
template <> struct Bar<double> { typedef int type; };
foo(10); // What is T?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.