每当我创建一个模板时,我知道将其作为函数参数传递,但是有什么特别的原因我不能在我的main函数中使用模板吗?
template <class Tmp>
int main()
{
Tmp pizza;
}
但是作为参数传递将始终有效
template <class Tmp>
Tmp add(Tmp x, Tmp y)
{
return x+y;
}
上面的代码不会运行,并且在我尝试的变量声明行旁边显示&#34;未知类型&#39; Tmp&#39; &#34;,但我认为因为我在主要功能之外声明了模板,所以会考虑到这一点。这有什么特别的原因吗?似乎每个人都只使用函数参数中的模板而已。
答案 0 :(得分:1)
你快到了。但是C ++是一种静态类型的语言,因此编译器需要在编译时知道pizza
的类型。此
template <class Y> struct/*members are public by default*/ Tmp
{
typedef Y type;
};
int main()
{
Tmp<int>::type pizza; /*pizza will be an int*/
}
是合法的。
答案 1 :(得分:1)
模板不是代码。模板......他们是模板。在调用模板函数之前,必须先实例化它。例如。
template <class T> T foo(T x) { return T;}
这只是一个模板,即如果单独编写,编译器将不会为此创建单行代码。只有在实例化并使用它时,编译器才会执行某些操作:
int main() {
int x = 0;
int y = foo<int>(x); // compiler instantiates the template and calls the int instance
}
在您的第一个代码段中,编译器不知道应该使用什么类型来实例化模板。此外,您无法将main
设为模板,因为任何程序的入口点都必须为int main()
。
PS:
好像每个人都只在函数参数中使用模板而已。
人们可以使用模板做更多事情。每当参数可以在编译时选择时,我喜欢将模板视为 来参数化我的代码。考虑这个(有点人为的)例子:
// template taking a functor as argument
// (more precisely: a default constructible callable type)
template <typename op,typename T> void plug(T x) {
std::cout << "op(" << x << ") = " << op()(x) << "\n";
}
// a simple functor
template <typename T>
struct identity { T operator()(T x){return x;} };
int main() {
plug<identity<double>,double>(2.0);
}
// prints:
// op(2) = 2
一旦实例化,该参数不会显示为函数参数,而是控制(模板化)函数实际对其参数执行的操作。
答案 2 :(得分:1)
是否有任何特殊原因导致我无法在主函数
中使用模板
您无法理解,但您的代码不使用主要功能中的模板。相反,您的代码正在尝试将main
定义为函数模板。这不是好事,因为main
的签名在标准中指定,并且它不是函数模板。当然,允许实现指定替代方案,但这对您没有帮助,因为您的实现没有指定任何模板功能替代方案。我的编译器(gcc)给出了比你更直接的错误信息,它说:
error: cannot declare ‘::main’ to be a template
您写的就好像您认为Tmp
被称为模板一样。如果是这样,那么通过回顾你的教科书/教程/其他来纠正这一点。 Tmp
不是模板。这是一个模板参数。在您的第二个代码段中,add
是一个功能模板,Tmp
仍然不是模板,它是add
的模板参数。
您可以在模板中使用其参数所在的模板参数。例如,以下情况很好:
template <class Tmp>
Tmp add(Tmp x, Tmp y)
{
Tmp total = x + y;
return total;
}
您的问题只是当您尝试此操作时,您在main
中尝试了它,它不能是模板。