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
,这显然需要三个参数。你期待什么?你想完成什么?