所以我正在玩模板专业化并遇到了一个问题。在编写下面的代码时我正在查看this。
我把它剪下来,但基本上我正在做一些错误的模板用于计算,我不知道是什么。从我发现的所有其他帖子中,人们忘记了“模板<>”在他们的专业课之前,但我不认为这是导致我的问题的原因。有什么建议吗?
#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;
}
答案 0 :(得分:0)
您已为calc
定义了具有3个参数的模板,但未对main()
中的前三个变量声明使用所有这些参数。
答案 1 :(得分:0)
您正在为实现提供特化,但您似乎也希望这也为主模板的模板参数提供默认值。事实并非如此。
要提供默认值,请尝试:
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");
};
并保留其余代码(包括特化)。查看代码的哪些部分将以哪种方式对更改做出反应,但请注意,这不会解决您的所有问题。它只是为了帮助您了解您正在混淆/混淆两种不同的东西。