2

如何制作带有 2 个参数而不是普通 1 个参数的模板特化?我正在构建一个指针类,现在我考虑扩展以创建一个数组,但如果我尝试这样的事情:

template<class T,int s> class pointer{};
template<class T> class pointer{};

class mama{};
int main(){
    pointer<mama> m;
}

它给了我一个错误。模板...用 1 个参数重新声明。

我需要它是专门的,因为它pointer<mama,10>有 size() 和 operator[] 而pointer<mama>没有,它有 operator-> 和 *。

4

3 回答 3

8

您可以为数组案例制作一个通用模板:

template <class TElem, int size = 0>
class pointer
{
    // stuff to represent an array pointer
};

然后是部分专业化:

template <class TElem>
class pointer<TElem, 0>
{
    // completely different stuff for a non-array pointer
};

通过为 size=0 的情况定义一个专门的版本,您实际上可以给它一个完全不同的实现,但具有相同的名称。

但是,只是给它一个不同的名称可能会更清楚。

于 2009-05-26T22:21:41.263 回答
3

您的代码中有类模板重新声明,这将导致编译时错误。您可以有默认模板参数和模板模板参数。

template<class T,int s=10> class pointer{};

class mama{};
int main(){
    pointer<mama> m;
}

我需要它专门因为指针有 size() 和 operator[] 而指针没有,它有 operator-> 和 *。

看起来好像您需要为您的班级提供不同的设计。我不确定模板专业化是否可行。从您的问题的外观来看,您确实应该考虑基于特征进行专业化。

于 2009-05-26T22:17:20.930 回答
2

您可以为第二个参数设置一个默认值,可能是这样的:

template <class T, int N=0>
class moo {
        T *foo;
public:
        moo() {
                if (N > 0) {
                        foo = new T[N];
                }
                else
                {
                        foo = new T;
                }
        }
};
于 2009-05-26T22:08:54.550 回答