在此代码中(准备编译):
#include "stdafx.h"
#include <iostream>
#include <sstream>
using std::cout;
template<class T, int first, int second>
T make()
{
T result = T();
std::stringstream interpreter;
interpreter << first << '.' << second;
interpreter >> result;
return result;
}
template<int first, int second, class T = double>
struct Make
{
typedef T value_type;
static value_type value;
};
template<int first, int second, class T>
T Make<first,second,T>::value = make<T,first,second>();
template<int first, int second>
struct Real
{
typedef double type;
static type value;
};
template<int first, int second>
typename Real<first,second>::type typename Real<first,second>::value = typename Make<first,second>::value;
int _tmain(int argc, _TCHAR* argv[])
{
//cout << Make<1,2>::value << '\n';//UNCOMMENT THIS AND SEE WHAT I MEAN
cout << Real<1,2>::value;
return 0;
}
请参阅上面的评论4行。
答案 0 :(得分:4)
尚未准备好编译(您不希望使用typename
您期望的变量名称)。修好这些东西后,我得到1.2
两个:
编辑:它在VS 2005中不起作用。这在VC ++中一定是个问题(至少在2005年)。这可能与他们如何在标准要求之后进行某些模板处理有关。但这只是猜测。
答案 1 :(得分:2)
如果在调用Make&lt; 1,2&gt; :: value之前调用Real&lt; 1,2&gt; :: value,它会先被初始化,因此它会获得Make&lt; 1,2&gt; :: value的初始非初始化值,这是0。
如果首先调用Make&lt; 1,2&gt; :: value,则使用make()函数正确初始化它,它获得值1.2。然后,由于Real&lt; 1,2&gt; ::值在之后被初始化,它将获得该值。
答案 2 :(得分:1)
这对我有两个调整,删除多余的typename减速:
template<int first, int second>
typename Real<first,second>::type typename Real<first,second>::value = typename Make<first,second>::value;
变为:
template<int first, int second>
typename Real<first,second>::type Real<first,second>::value = Make<first,second>::value;
(至少在gcc 4.4.4中)
结果是1.2,1.2 - 这是预期的(?)