gpt4 book ai didi

C++ 模板和隐式类型转换

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:49:28 30 4
gpt4 key购买 nike

我有以下代码:

#include <iostream>
#include "boost/shared_ptr.hpp"

using boost::shared_ptr;

class Base {
public:
virtual ~Base() {}
virtual void print() = 0;
};

template <typename T>
class Child : public Base {
public:
virtual void print() {
std::cout << "in Child" << std::endl;
}
};

class GrandChild : public Child<int> {
public:
virtual void print() {
std::cout << "in GrandChild" << std::endl;
}
};

template <typename T>
void call_print(shared_ptr<Child<T> > a) {
a->print();
}

void call_base_print(shared_ptr<Base> a) {
a->print();
}

int main() {
shared_ptr<GrandChild> gchild(new GrandChild);
call_print(shared_ptr<Child<int> >(gchild));
// call_print(gchild); // Cannot compile!
call_base_print(gchild); // This works.
return 0;
}

我发现 call_base_print(gchild) 有效但 call_print(gchild) 导致编译器错误很奇怪。我知道 C++ 不允许两次隐式转换,但我不认为这里有两次转换......任何人都可以启发我吗?

最佳答案

您还没有到达类型转换的地步。它较早地在模板实例化中失败。

call_base_print不需要类型推导。 call_print<T>(shared_ptr<Child<T> > a)做。你传递的是 shared_ptr<GrandChild> .而且根本没有 T 可以替代 shared_ptr<Child<T> >shared_ptr<GrandChild> .因此实例化失败,没有函数可以调用。

关于C++ 模板和隐式类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1366896/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com