c++ - 如果模板构造函数参数派生自非模板基类(犰狳),它们似乎并不关心它们的类型
问题描述
我有以下两个类(人为的例子):
#include <armadillo>
template<typename T>
class A : public arma::vec3
{
public:
using arma::vec3::vec3;
};
template<typename T>
class B
{
public:
B(const A<T>& a) {}
};
运行以下代码时:
int main()
{
A<int> a;
B<int> b_i { a }; // Should always pass.
B<double> b_d { a }; // Should fail as template type is different between class and constructor argument.
}
我预计此页面底部会出现错误,因为对象 b_d 具有模板类型 double 并且 B 的构造函数中的模板类型与 B 类的模板相同,但是此代码通过没有任何问题,即不对。
但是,如果我删除继承的 arma::vec3 构造函数:
#include <armadillo>
template<typename T>
class A : public arma::vec3
{};
template<typename T>
class B
{
public:
B(const A<T>& a) {}
};
我得到了预期的行为(编译时错误):
error: no matching function for call to ‘B<double>::B(<brace-enclosed initializer list>)’
B< double > b_d { a }; // Should fail as template type is different between class and constructor argument.
我不是模板专家,也不知道犰狳向量库的内部工作原理,但谁能想到继承 arma::vec3 构造函数会破坏我的代码(不抛出错误)的任何原因?谢谢
解决方案
因为A<T>
(for any T
) 是 a vec3
(因为继承),并且您是根据文档包含复制构造函数的构造函数,所以该using
对象将很高兴从任何对象复制构造。vec3
A<T>
vec3
当您将构造函数using arma::vec3::vec3
复制到类中而不进行修改时,它基本上会创建一个构造函数,而不是构造函数。vec3
A<T>
A(const vec3&)
A(const A&)
当您没有该using
部分时,编译器自动生成的复制构造函数将是A<T>
该类唯一可用的复制构造函数,它将是A(const A&)
.
推荐阅读
- c# - 使用 C# 从 Microsoft.GroupPolicy.GPTrustee 获取名称/Sid
- typescript - 使用类名来定义类型中的属性
- sql - 尝试在两个过滤表之间执行 SQL 连接
- node.js - MulterS3 - 检查请求对象的控制流
- python - QT/QML 数据模型
- html - 你能帮我在 jquery 中按价格排序吗
- json - 如何将json字符串转换回Angular 8中的对象
- angular - 以角度提供侧面渲染在所有页面中都不起作用 sping boot 后端
- reactjs - 带有 React Native 的 Realm JS
- personality-insights - 我在哪里可以获得 watsonPI api 文档?