传递可变参数模板参数时Visual Studio错误

时间:2016-07-16 14:24:43

标签: c++ visual-studio c++11 visual-studio-2015 variadic-templates

我有一个带有可变数量模板参数的模板函数,它们被'中继'到std :: function参数:

0 is present in the array - false
1 is present in the array - true
2 is present in the array - false
3 is present in the array - true
4 is present in the array - false
5 is present in the array - true
6 is present in the array - false

编译并运行正常,但visual studio以红色突出显示 test1 -calls的全部,并显示以下错误消息:

template<typename... Args>
    void test1(const std::function<void(Args...)> &function)
{}

static void t(float) {}

int main(int argc,char *argv[])
{
    test1<float>(nullptr);
    test1<float>(&t);
    test1<float>([](float f) -> void {

    });
    return EXIT_SUCCESS;
}

另一方面,这并未显示为错误:

template<class... Args> void test1(const std::function<void(Args...)> &function)

no instance of function template "test1" matches the argument list
    argument types are: (lambda []void(float f)->void)

我是否为第一个案件做错了什么或者这是假阳性?这只是visual studio本身的错误,编译器甚至不会发出任何警告。

//编辑:

我刚刚在Linux上使用g ++ - 5进行了一些测试,它根本不让我编译代码:

template<typename... Args>
    void test2(Args... a)
{}
int main(int argc,char *argv[])
{
    test2<float>(1.f);
    return EXIT_SUCCESS;
}

2 个答案:

答案 0 :(得分:1)

Visual Studio解析稍微落后于编译器,并单独实现。变量模板对于visual studio来说仍然是一个新手,所以它可能是一个已知的限制/错误。

更新:

即使使用最新版本的clang,我也不清楚会发生什么: live example因为你确实将Args...修复为``float`,但相应的非模板代码确实编译了。

此外,如果您将Args...更改为Args,它确实有效。我不明白为什么......

更新2:我发现你的问题是重复的,答案很好: variadic templates parameter matching in std::function

草率摘要:当您写test2<float>时,它或多或少意味着test2<float,Args...>,这阻碍了进一步的转换。

答案 1 :(得分:1)

要解决问题并使程序按预期工作,可以将测试函数包装在模板结构中:

template<typename... Args>
struct foo {
   static void test1(const std::function<void(Args...)> &function) {}
};

并称之为:

foo<float>::test1(nullptr);
foo<float>::test1(&t);
foo<float>::test1([](float f) -> void {

});

肯定会阻止推断Args...