0

当我试图完成数据结构分配时,在实现文件中有一些函数以:

template <class ItemType>
ClassName<ItemType>::ClassName( )
{
}

我现在很清楚

<ItemType> 

用于替换特定类型(String、double、int 等)。但它的作用是什么

template <class ItemType>

就像每次函数实现之前我们都要说的那样?

4

2 回答 2

2

它是告诉编译器类或函数是模板类/函数,以及模板参数的名称是什么。

对于普通函数参数,声明中的名称不必与定义中的名称相同。所以你可以有例如

template<typename Foo>
struct Bar
{
    void f(int a);
};

template<typename Beer>
void Bar<Beer>::f(int flop)
{
}
于 2013-11-14T07:30:35.173 回答
1

它是定义嵌套模板类和函数的一部分,以及它们在包含类之外的特化:

#include <exception>

template<class yams_t>
class outer
{
public:

    template<class potatoes_t>
    class inner;
};

template<class yams_t>
template<class potatoes_t>
class outer<yams_t>::inner
{
public:

    template<typename result_t>
    result_t verb_my_noun();
};

template<class yams_t>        // yams_t is resolved first
template<class potatoes_t>    // potatoes_t is resolved next
template<typename result_t>   // result_t is resolved last
result_t outer<
    yams_t  // we want to parameterize outer<> first
    >::inner<
    potatoes_t    // then inner<>
    >::verb_my_noun()    // then verb_my_noun()
{
    return result_t(47);
}

template<>
class outer<float>
{
public:

    template<class potatoes_t>
    class inner;
};

template<>
class outer<float>::inner<float>
{
public:

    template<typename result_t>
    result_t verb_my_noun()
    {
        throw std::exception("You've been verbed!");
    }
};

template<>
class outer<float>::inner<double>
{
public:

    template<typename result_t>
    result_t verb_my_noun();
};

// As this is a full specialization of both
// outer<> and its inner class inner<>,
// we don't need two 'template<>'s above this.
//
// However, we still need a template<> for verb_my_noun()
template<typename result_t>
result_t outer<float>::inner<double>::verb_my_noun()
{
    return result_t();
}

例子:

int main(int argc, char **argv)
{
    outer<int>::inner<unsigned> good_thing;

    float x = good_thing.verb_my_noun<float>();

    // x is 47.0

    outer<float>::inner<float> bad_thing;

    // throws exception("You've been verbed!");
    float cant_see_me = bad_thing.verb_my_noun<float>();

    return 0;
}



另请注意,您可以执行以下愚蠢的操作:

template<
    class alpha_t, // #1
    class beta_t,  // #2
    class gamma_t  // #3
>
class thing
{
    void frob();
};

template<
    class herp_t, // #1
    class derp_t, // #2
    class dorp_t  // #3
>
void thing<herp_t,derp_t,dorp_t>::frob()
{
}

请不要实际做任何类似上述的事情。它是为了说明而存在的,在实践中,它使模板代码非常难以阅读。

于 2013-11-14T09:32:27.833 回答