我在给模板指针参数提供指向派生类而不是基类的指针时遇到了问题。 E.I.以下代码:
class First{};
class Second : public First {};
template<First* ptr> class Third {};
Second obj;
int main(){
Third<&obj> obj2;
}
编译时返回错误:
error C2440: 'specialization' : cannot convert from 'Second *' to 'First *'
有没有办法克服这个问题?我知道,我可以将指针作为参数传递给Third
的构造函数而不是它的模板参数,但是我想在不同的指针上区分类Third
的对象。编译,以便只能使用Third
的对象和指定上下文中适当的指针。
答案 0 :(得分:2)
模板类型推导没有隐式类型转换,因此您的示例无法编译。
相关:C++ Templates type casting with derivates
在非模板代码中,一切正常,例如
First *p = &obj;
工作正常。
您的示例与
具有相同的风格template <int N>
void f(){}
int main()
{
f<42.42>(); // fails, double is not converted to int here
}
错误:对于非类型模板参数
,不考虑从'double'到'int'的转换