【发布时间】:2020-04-29 06:13:35
【问题描述】:
这是问题的简化版本:
假设我有一个带有非类型参数的模板化基类,以及 2 个具有专业化的派生类。
template <int val>
struct Base {
};
struct Derived1 : public Base<1> {
};
struct Derived2 : public Base<2> {
};
template <int val>
int get(std::unique_ptr<Base<val>> ptr) {
return val;
}
int main()
{
// these work
std::unique_ptr<Base<1>> d1 = std::make_unique<Derived1>();
std::unique_ptr<Base<2>> d2 = std::make_unique<Derived2>();
// these fail
// auto d1 = std::make_unique<Derived1>();
// auto d2 = std::make_unique<Derived2>();
std::cout << get(std::move(d1)) << std::endl;
std::cout << get(std::move(d2)) << std::endl;
}
思路是在get()函数中,当传入派生类unique_ptr时,我想获取基类模板中参数的值。
main() 函数表明,如果我不使用auto 并明确指定基类类型,模板将匹配得很好。但是,如果我切换到auto,则类型变为unique_ptr<DerivedX>,然后它不会编译。
如果我将 unique_ptr 切换为原始指针(即 Base<val>* 而不是 unique_ptr<Base<val>>),一切都会正常工作。如果 C++ 模板包装在另一个传递给函数的模板中,它似乎不处理类型推导?
我在这里缺少一些基本的东西吗?谢谢。
【问题讨论】:
标签: c++