Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板专门化-模板参数太少_C++_Templates_Template Specialization - Fatal编程技术网

C++ 模板专门化-模板参数太少

C++ 模板专门化-模板参数太少,c++,templates,template-specialization,C++,Templates,Template Specialization,所以我在玩弄模板专门化时遇到了一个问题。在编写下面的代码时,我正在查看 我减少了它,但基本上我做了一些错误的模板计算,我不知道是什么。从我看到的所有其他帖子中,人们在他们的专业课之前忘记了“模板”,但我不认为这是导致我的问题的原因。有什么建议吗 #include <type_traits> #include <iostream> template <typename T, bool isDouble = std::is_same<T, double>:

所以我在玩弄模板专门化时遇到了一个问题。在编写下面的代码时,我正在查看

我减少了它,但基本上我做了一些错误的模板计算,我不知道是什么。从我看到的所有其他帖子中,人们在他们的专业课之前忘记了“模板”,但我不认为这是导致我的问题的原因。有什么建议吗

#include <type_traits>
#include <iostream>

template <typename T, bool isDouble = std::is_same<T, double>::value>
struct precision
{ 
    typedef T p_type;
    /* some stuff here*/
};

template <typename T>
struct precision<T, false>
{ 
    typedef T p_type;
    /* some stuff here*/
};

template <typename P>
struct is_double
{ 
    static const bool value = std::is_same< typename P::p_type, double >::value;
};

template <typename T, typename SP, typename DP>
struct calc
{
    static_assert(!is_double<SP>::value, "SP is not single precision");
    static_assert(is_double<DP>::value, "DP is not double precision");
};

template <typename T, typename SP>
struct calc<T, SP, precision<double>>
{
    static_assert(!is_double<SP>::value, "SP is not single precision");
};

template <typename T, typename DP>
struct calc<T, precision<float>, DP>
{
    static_assert(is_double<DP>::value, "DP is not double precision");
};

template <typename T>
struct calc<T, precision<float>, precision<double>>
{ };

int main()
{
    calc<int> t1; //"too few template arguments"
    calc<int, precision<double> > t2; //"too few template arguments"
    calc<int, precision<float> > t3; //"too few template arguments"
    calc<int, precision<float>, precision<double>> t4;
}
#包括
#包括
模板
结构精度
{ 
类型定义T p_类型;
/*这里有些东西*/
};
模板
结构精度
{ 
类型定义T p_类型;
/*这里有些东西*/
};
模板
结构是双的
{ 
static const bool value=std::is_same::value;
};
模板
结构计算
{
static_assert(!is_double::value,“SP不是单精度”);
静态断言(是double::value,“DP不是双精度”);
};
模板
结构计算
{
static_assert(!is_double::value,“SP不是单精度”);
};
模板
结构计算
{
静态断言(是double::value,“DP不是双精度”);
};
模板
结构计算
{ };
int main()
{
calc t1;/“模板参数太少”
calc t2;/“模板参数太少”
calc t3;/“模板参数太少”
钙t4;
}

您已使用3个参数定义了
calc
的模板,但未将所有这些参数用于
main()
中的前三个变量声明。您正在为实现提供专门化,但您似乎期望这也为主模板的模板参数提供默认值。事实并非如此

要提供默认值,请尝试:

template <typename T, typename SP = precision<float>, typename DP = precision<double>>
struct calc
{
    static_assert(!is_double<SP>::value, "SP is not single precision");
    static_assert(is_double<DP>::value, "DP is not double precision");
};
模板
结构计算
{
static_assert(!is_double::value,“SP不是单精度”);
静态断言(是double::value,“DP不是双精度”);
};

并保持代码的其余部分(包括专门化)不变。查看代码的哪些部分将以何种方式对更改作出反应,但请注意,这并不能解决所有问题。这只是为了帮助您理解您正在混合/混淆两种不同的东西。

错误就是它所说的:
calc
始终有三个模板参数,并且没有一个具有默认参数。在
main
中,您给它的模板参数少于三个。这是正常行为,它无法匹配任何专门化,并且匹配
template struct calc
,这显然需要三个参数。你期待什么?你想完成什么?