失败的代码如下:
#include <memory>
template<size_t N>
class A
{};
template<size_t N>
int testFct(std::shared_ptr<const A<N>> aptr) { return 1; }
int main() {
auto APtr = std::make_shared<A<2>>();
testFct(APtr);
}
在类似的情况下,可以隐式地从std::shared_ptr<T>
投射到std::shared_ptr<const T>
- 为什么我会收到错误通知我'std::shared_ptr<A<2ul> >' is not derived from 'std::shared_ptr<const A<N> >'
?
问题可能是A<N>
and A<2>
之间没有关系,但该函数模板化只需要一个N
。我可以安排函数来避免(重新)模板化这个类吗?
另一方面,添加功能
template<size_t N>
int testFct(std::shared_ptr<A<N>> aptr) {
return testFct(static_cast<std::shared_ptr<const A<N>>>(aptr));
}
允许代码编译(并且可能在没有问题的情况下运行)。