这就是我的.h文件中的DbQuery类:
template<typename T>
void showResults(Query<T>::Keys& keys, std::ostream& out = std::cout)
{
out << "\n ";
for (auto key : keys)
{
out << key << " ";
}
}
这是我的.cpp文件中的内容:
bool testR6a()
{
Utilities::title("Demonstrating Requirement #6a - query for value");
DbP dbp;
Query<std::string> query;
Query<std::string>::Keys result = query.qKeys(dbp.db(), "a");
showResults(query.qKeys(dbp.db(), "a"));
return true;
}
我无法弄清楚我的实例有什么问题。 E0304:没有函数模板“DbQuery :: showResults”的实例与参数列表匹配 参数类型是: (标准::矢量&GT)
有人知道吗?
我觉得我不认为我可以编写一个简单的例子。这只是大型程序的一小部分,我不知道如何简化它。 我不知道这张图片是否能让你更好地理解:
答案 0 :(得分:2)
问题在于您依赖于模板参数推导,而您的功能模板是以不支持它的方式编写的。简而言之,C ++标准定义了几个&#34;非推导的上下文&#34;。当模板参数出现在其中一个参数中时,它不会从相应的函数参数中推导出来。其中一个上下文位于范围解析的左侧。
我所说的是编译器无法使用Query<T>::Keys& keys
来推断T
。这就是你收到错误的原因。您需要明确指定它:
showResults<std::string>(query.qKeys(dbp.db(), "a"));
嗯,不是真的。还有你的代码不正确的问题。除非query.qKeys(...)
返回非const左值引用(我怀疑它),否则您的代码在任何符合标准的C ++编译器上都是错误的。 MSVC允许将非const左值引用绑定到临时对象作为扩展。但它不是可移植的C ++。您似乎已经对此有所了解,因为您声明了result
。所以采用上述方法进行适当的调用:
showResults(result);
或者,如果您的函数不需要修改传递的参数,则接受const引用。
答案 1 :(得分:1)
StoryTeller的答案很好(自动扣除不起作用)。从理论上讲,您可以将功能简化为此功能。现在推导应该自动发生,因此您不需要为编译器提供进一步的提示。
template<typename T>
void showResults(T& keys, std::ostream& out = std::cout)
{
out << "\n ";
for (auto key : keys)
{
out << key << " ";
}
}