为什么必须在使用模板的每个函数之前声明模板?

时间:2015-02-23 19:34:52

标签: c++ templates

为什么以下代码有效

template<class T>
T AddThree(T input)
{
    return input + 3;
}

template<class T>    // If I remove this line it won't compile
T SubtractThree(T input)
{
    return input - 3;
}

但如果我注释掉该行表明它不会编译?为什么编译器从第一次声明时就不知道template<class T>(就像在文件正文中声明的其他内容一样)?

3 个答案:

答案 0 :(得分:5)

您可以将其视为功能签名的一部分。如果你在一行上写完整的声明,也许更容易看到连接:

template<class T> T AddThree(T input)
{
    return input + 3;
}

就像你需要为每个函数声明参数一样。你不会期望这个工作:

std::string AddThree(std::string input)
{
    return input + "3";
}

std::string SomethingElse(input)
{
    // ...
}

在这里,与模板参数一样,您需要在第二个函数和第一个函数中声明input。这是该语言的范围规则:)

答案 1 :(得分:2)

注意声明终止符(分号或函数体)的位置。 template <class T>本身不是声明 - 它不是整个文件范围内的东西。它是有问题的功能模板声明的一部分。

答案 2 :(得分:1)

编译器如何知道SubtractThree是模板化函数?显然,您不希望单个模板声明表示所有后缀是模板。您还可以设想设计C ++规范,使每个无法识别的类(在本例中为T)被视为模板,但是当您拼错类时,您可能会冒险制作模板函数。