我的代码的简化版本如下所示:
template <class T>
struct Base
{
void SayHello( T* aDerived )
{
}
void SaySomething()
{
SayHello( this ); // This is where the error happens
}
};
struct Derived : public Base< Derived >
{
};
int main(int argc, const char * argv[])
{
Derived iDerived;
iDerived.SaySomething();
}
并且它不会在SayHello( this )
出现此错误消息的行上编译:
Cannot initialize a parameter of type 'Derived *'
with an rvalue of type 'Base<Derived> *'
现在编译器抱怨这一点是有道理的,尽管在我看来有点愚蠢,如果我删除这一行它不会抱怨:
iDerived.SaySomething();
无论如何,可以通过执行显式类型转换来解决问题,如下所示:
SayHello( (T*)this );
Base
问题是我的实际代码以许多这些类型转换结束,在我看来,只包含允许它自动转换到其模板类(T
)的东西似乎是合理的。
是operator=
我追求的吗?有人可以提供一个代码示例来说明这是如何完成的吗?这个问题表明我可以做类似的事情:
演员表总是介于this
和之间T*
。
operator T*()
{
return (T*)this;
}
但错误仍然存在。