为什么以下代码有效
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>
(就像在文件正文中声明的其他内容一样)?
答案 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)被视为模板,但是当您拼错类时,您可能会冒险制作模板函数。