Variadic模板未编译

时间:2014-01-02 08:43:14

标签: c++ c++11 variadic-templates

代码:

#include <iostream>

template<typename T>    
void out()                   // line 4
{
}

template<typename T, typename... Args>
void out(T value, Args... args)        // line 9
{
    std::cout << value;
    out(args...);    // line 12
}

int main()
{
    out("12345", std::endl);    // line 17
    return 0;
}

构建错误:

g++ -O0 -g3 -Wall -c -fmessage-length=0 -std=c++11 -pthread -MMD -MP -MF"main.d" -MT"main.d" -o "main.o" "../main.cpp"
../main.cpp: In function ‘int main()’:
../main.cpp:17:24: error: no matching function for call to ‘out(const char [6], <unresolved overloaded function type>)’
../main.cpp:17:24: note: candidates are:
../main.cpp:4:6: note: template<class T> void out()
../main.cpp:4:6: note:   template argument deduction/substitution failed:
../main.cpp:17:24: note:   candidate expects 0 arguments, 2 provided
../main.cpp:9:6: note: void out(T, Args ...) [with T = const char*; Args = {}]
../main.cpp:9:6: note:   candidate expects 1 argument, 2 provided

我希望这个程序给出与std::cout << "12345" << std::endl;相同的结果模板函数有什么问题?

2 个答案:

答案 0 :(得分:6)

问题是你使out的无参数版本成为模板,如果没有显式提供模板参数就无法调用它。因此

void out() {}

template<typename T, typename... Args>
void out(T value, Args... args) {
    std::cout << value;
    out(args...);
}

int main() {
    out(1, 2.0, "3");
    return 0;
}

按预期工作。

答案 1 :(得分:3)

语法错误(错误.)使编译器变得疯狂。

之后,您可能还会遇到out("12345", std::endl)调用问题,std::endl是编译器无法选择的重写函数(只是将其强制转换为static_cast<std::ostream&(*)(std::ostream&)>(std::endl)

此外,out中的递归以out()调用结束,但没有带有0个参数。(另请参阅yuri回答:https://stackoverflow.com/a/20879525/924727