专门化类模板的成员函数模板

时间:2009-07-15 18:02:29

标签: c++ templates

我有以下代码:

#include <stdio.h>

template<int A>
class Thing
{ // 5
    public:
        Thing() :
            data(A) {
        }

        template<int B>
        Thing &operator=(const Thing<B> &other) {
            printf("operator=: A = %d; B = %d\n", A, B);
            printf("this->data = %d\n", data);
        }

    private:
        int data;
};

int main() {
    Thing<0> a, b;
    Thing<1> c;

    a = b;
    a = c;
    c = b;

    return 0;
}

我需要为Thing<A>::operator=专门设置A == B。我试过这个:

template<int B>
template<int A>
Thing<A> &Thing<A>::template operator=(const Thing<A> &other) { // 23
    printf("operator= (specialized): A = %d; B = %d; A %c= B\n", A, B, (A == B) ? '=' : '!');
    printf("this->data = %d; other.data = %d\n", data, other.data);
}

但是,我收到g ++编译错误:

23: error: invalid use of incomplete type ‘class Thing<B>’
 5: error: declaration of ‘class Thing<B>’

我尝试在if(A == B)中使用operator=而没有专业化。但是,我收到访问私有成员data的错误,我需要访问A == B

如何正确地专门化我的班级模板operator=的成员函数模板Thing

2 个答案:

答案 0 :(得分:2)

我认为你不需要专门化它,你不能只为operator=提供过载吗?

template<int A>
class Thing
{ // 5
    public:
        Thing() :
            data(A) {
        }

        template<int B>
        Thing &operator=(const Thing<B> &other) {
            printf("operator=: A = %d; B = %d\n", A, B);
            printf("this->data = %d\n", data);
        }

        Thing &operator=(const Thing &other) {
            printf("operator overload called");
            printf("this->data = %d\n", data);
        }

    private:
        int data;
};
如果你试图将重载与特化相结合,那么IIRC会有一些查找问题,但这里看起来并不合适。

答案 1 :(得分:2)

是的,我认为重载应该可以正常工作,但是由于参数和模板的匹配顺序,可能会发生一些奇怪的事情。

为了完整起见,以下是如何编写原始示例:

template<int A>
class Thing
{ // 5
...
template<int B>
Thing<A> &operator=(const Thing<A> &);
};

template<int A>
template<int B>
Thing<A> &Thing<A>::operator=(const Thing<A> &other) { // 23
    ...