2015-02-23 141 views
2

为什么下面的代码有效为什么模板必须在每个使用函数之前声明?

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>(就像在文件主体中声明的其他东西一样)?

回答

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。这是该语言的范围规则:)

+0

谢谢!我没有想过,声明模板的行实际上只是函数声明的一部分:) – Kvothe 2015-02-23 19:44:17

1

编译器如何知道SubtractThree是模板化函数?显然你不希望单个模板声明意味着所有内容后缀是一个模板。你也可以想象设计C++规范,使得每个无法识别的类(在这种情况下,T)被视为模板,但是当你拼错类时,你冒险制作模板函数。

2

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

+1

谢谢。我没有想过宣言终结者 - 我以为'template '本身就是一个声明。 – Kvothe 2015-02-23 19:46:00

相关问题