C ++没有函数模板的实例

时间:2018-02-14 04:50:00

标签: c++

这就是我的.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)

有人知道吗?

我觉得我不认为我可以编写一个简单的例子。这只是大型程序的一小部分,我不知道如何简化它。 我不知道这张图片是否能让你更好地理解:

screenshot

2 个答案:

答案 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 << " ";
    }
}