《Effective C++》条款43
2023-12-21 13:30:52
学习处理模板化基类内的名称
我想实现这样的一种:
class A { void test1(); void test2(); }; class B { void test1(); void test2(); }; template<class T> class sender { public: void runtest1() { T t; t.test1(); } void runtest2() { T t; t.text2(); } };
但是我们有时候想标记是哪个类执行的函数,想做日志信息。所以可以这样:
template<class T> class senderlog:public sender<T> { public: void test1log() { // log记录 runtest1(); // log记录 } }; // 但是不能通过编译
为什么不能通过编译??
因为编译器不知道它继承什么样的class。它继承的是sender<T>,但是其中的T是个模板参数,不到后来被具现化无法确切知道它是什么。或者说根本不知道它有没有sender函数。
详细点说,假设有个类,它只有一个函数:
class C
{
void test1();
};
这个时候就需要一个特化版本:
template<>
class sender<C>
{
public:
void runtest1()
{
C c;
c.test1();
}
};
解决上述报错的三种方法:
template<class T>
class senderlog:public sender<T>
{
public:
void test1log()
{
// log记录
this->runtest1();
// log记录
}
};
template<class T>
class senderlog:public sender<T>
{
public:
using sender<T>::runtest1();
void test1log()
{
// log记录
runtest1();
// log记录
}
};
template<class T>
class senderlog:public sender<T>
{
public:
void test1log()
{
// log记录
sender<T>::runtest1();
// log记录
}
};
?
文章来源:https://blog.csdn.net/qq_64863535/article/details/135127085
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!