反正使用模板不作为参数,但作为全局类型?

时间:2016-08-04 09:21:07

标签: c++ templates

每当我创建一个模板时,我知道将其作为函数参数传递,但是有什么特别的原因我不能在我的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;,但我认为因为我在主要功能之外声明了模板,所以会考虑到这一点。这有什么特别的原因吗?似乎每个人都只使用函数参数中的模板而已。

3 个答案:

答案 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中尝试了它,它不能是模板。