【发布时间】:2014-12-10 18:19:15
【问题描述】:
从一个基本的 CRTP 开始,核心概念是 this 指针转换 -
#include "stdafx.h"
#include <iostream>
using namespace std;
template<class T>
class A
{
public:
void a0(){ static_cast<B*>(this)->a2(); }
void a2(){ cout << "a2 base" << endl; }
};
class B: public A<int>//<int>
{
public:
void a1(){ a0(); }
void a2(){ cout << "a2 derived" << endl; }
};
int _tmain(int argc, _TCHAR* argv[])
{
B b;
b.a1();
return 0;
}
如果 A 不是模板,为什么强制转换失败? (MSVC:错误 C2440:'static_cast':无法从 'A *const' 转换为 'B *')
或者反过来,如果它是一个模板,为什么它会起作用。
class B;
class A
{
public:
void a0(){ static_cast<B*>(this)->a2(); }
void a2(){ cout << "a2 base" << endl; }
};
class B: public A
{
public:
void a1(){ a0(); }
void a2(){ cout << "a2 derived" << endl; }
};
可能与模板实例化的时间有关,但我对细节很好奇。
【问题讨论】: