C++ 为什么我得零分?

C++ 为什么我得零分?,c++,templates,C++,Templates,在此代码中(准备编译): #包括“stdafx.h” #包括 #包括 使用std::cout; 模板 T make() { T结果=T(); stringstream解释器; 解释器这对我来说有两个调整,删除多余的typename减速: template<int first, int second> typename Real<first,second>::type typename Real<first,second>::value = typename M

在此代码中(准备编译):

#包括“stdafx.h”
#包括
#包括
使用std::cout;
模板
T make()
{
T结果=T();
stringstream解释器;

解释器这对我来说有两个调整,删除多余的typename减速:

template<int first, int second>
typename Real<first,second>::type typename Real<first,second>::value = typename Make<first,second>::value;  
模板
typename Real::type typename Real::value=typename Make::value;
变成:

template<int first, int second>
typename Real<first,second>::type Real<first,second>::value = Make<first,second>::value;
模板
typename Real::type Real::value=Make::value;
(至少在gcc 4.4.4中)


结果是1.2,1.2-这与预期的一样(?)

这对我来说很有效,有两个调整,删除多余的typename减速:

template<int first, int second>
typename Real<first,second>::type typename Real<first,second>::value = typename Make<first,second>::value;  
模板
typename Real::type typename Real::value=typename Make::value;
变成:

template<int first, int second>
typename Real<first,second>::type Real<first,second>::value = Make<first,second>::value;
模板
typename Real::type Real::value=Make::value;
(至少在gcc 4.4.4中)


结果是1.2,1.2-这与预期的一样(?)

还没有准备好编译(在需要变量名的地方不使用
typename
)。修复这些内容后,我得到了
1.2


编辑:它在VS 2005中不起作用。这在VC++中一定是个问题(至少在2005年)。这可能与他们在标准要求之后如何进行某些模板处理有关。不过,这只是猜测。

还没有准备好编译(在需要变量名的地方不使用
typename
).在修复这些东西后,我得到了以下两个方面的
1.2

编辑:它在VS2005中不起作用。这在VC++中一定是个问题(至少在2005年)。这可能与他们在标准要求之后如何进行某些模板处理有关。不过,这只是一个猜测。

如果在调用Make::value之前调用Real::value,它首先会初始化,因此它会得到Make::value的初始非初始化值,即0

如果您首先调用Make::value,它将使用Make()函数正确初始化,它将获得值1.2。然后,由于Real::value随后初始化,它将获得该值。

如果您在调用Make::value之前调用Real::value,它将首先初始化,因此它将获得Make::value的初始未初始化值,即0



如果您首先调用Make::value,它将使用Make()正确初始化函数,它得到值1.2。然后,由于Real::value随后被初始化,它得到了该值。

为什么我得到了downvote?询问您有问题的主题是否可以?列出实际和预期的输出以及使用的编译器可能会有所帮助。不,这是因为您的问题不清楚。如果您说“//comm”如果这是为了重现问题,那是有道理的。目前的代码运行良好。如何生成1.02?生成1.2。顺便说一句,对每个没有帮助的答案进行向下投票,因为你的问题不清楚,这是一种愚蠢的行为。在你澄清问题后,我删除了我的。为什么我得到向下投票?问关于topi的问题不可以吗c你有问题吗?列出实际和预期的输出以及使用的编译器可能会有帮助。不,这是因为你的问题不清楚。如果你说“//注释这个以重现问题”,这是有意义的。目前的代码运行良好。如何使1.02?make给出1.2.btw OP,对每个不是他的答案进行向下表决lpful,因为你的问题不清楚,这是一件很愚蠢的事情。在你澄清了q.@Nim之后,我删除了我的问题。但是你是否尝试用Real::value编译代码?当我注释main()中的第一行时我得到0。如果我两个都离开,我得到1.21。2@There&Armen..,呃,在我的辩护中,评论/取消注释行不是很清楚,根据你最初的问题答案是正确的,但是现在你已经澄清了,是的,这更有意义…尽管对否决票有点苛刻…没关系…@Nim:没有人要你付费,没有必要辩护,我只是想问你删除第一行时得到了什么。:)那么,你得到了什么?无论如何,在gcc上,这很好…这意味着正如Armen上面所说,这是你的编译器的问题…@Nim但是你试着用Real::value编译代码了吗?当我在main()中注释第一行时我得到0。如果我两个都离开,我得到1.21。2@There&Armen..,呃,在我的辩护中,评论/取消注释行不是很清楚,根据你最初的问题答案是正确的,但是现在你已经澄清了,是的,这更有意义…尽管对否决票有点苛刻…没关系…@Nim:没有人要你付费,没有必要辩护,我只是想问你,当你删除第一行时,你得到了什么:)那么,你得到了什么?无论如何,在gcc上,这很好…这意味着,正如Armen上面所说,这是你的编译器的问题…我没有否决你的意见,但我猜是代码板链接。只要将代码粘贴到答案中——这样就可以很好地查看代码。我在在我在VS 2005中尝试过之后,fo。所以你不是完全疯了。@Lou:是的,但是So不会像codepad那样运行代码并显示输出。输出是这里的导入部分。我没有否决你的意见,但我猜是codepad链接。只需将代码粘贴到答案中,这样就可以很好地查看代码。在VS 2005中尝试过之后,我编辑了更多信息。所以你不是完全疯了。@Lou:是的,但是So不会像codepad那样运行代码并显示输出。输出是这里的导入部分。