模板专业化 - 模板参数太少

时间:2014-08-07 21:04:52

标签: c++ templates template-specialization

所以我正在玩模板专业化并遇到了一个问题。在编写下面的代码时我正在查看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;
}

2 个答案:

答案 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");
};

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