加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何在子类(c)中专门化模板方法?

发布时间:2020-12-16 03:32:08 所属栏目:百科 来源:网络整理
导读:我正在尝试在其子类中专门化非模板类的模板方法: // .h文件 class MyWriter {public: templatetypename T void test(const T val) { std::cout val "n"; }}; // .cpp文件 class MyType {public: MyType(int aa,double dd) : a(aa),d(dd) {} int a; double
我正在尝试在其子类中专门化非模板类的模板方法:

// .h文件

class MyWriter {
public:
    template<typename T>
    void test(const T & val) {
        std::cout << val << "n";
    }
};

// .cpp文件

class MyType {
public:
    MyType(int aa,double dd) : a(aa),d(dd) {}
    int a;
    double d;
};

class MyWriterExt : public MyWriter {
public:
    template<> void test(const MyType &val) {
        test(val.a);
        test(val.d);
    }
};

int main() {
    MyWriterExt w;
    w.test(10);
    w.test(9.999);
    w.test(MyType(15,0.25));
 return 0;
}

但是我收到一个错误:

Error 1 **error C2912**: explicit specialization; 
'void MyWriterExt::test(const MyType &)' is not a specialization of a function 
    template testtemplate.cpp 30

如何扩展MyWriter类以支持用户定义的类?

解决方法

应该对同一个类进行专门化,不是为了子类,也是在类体之外:
class MyWriter {
public:
    template<typename T>
    void test(const T & val) {
        std::cout << val << "n";
    }
};

template<>
void MyWriter::test<MyType>(const MyType & val) {
    test(val.a);
    test(val.d);
}

您不需要子类来专门化原始成员函数模板.

还要考虑overloading而不是专业化.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读