首页 > 解决方案 > 如果模板构造函数参数派生自非模板基类(犰狳),它们似乎并不关心它们的类型

问题描述

我有以下两个类(人为的例子):

#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 构造函数会破坏我的代码(不抛出错误)的任何原因?谢谢

标签: c++templatesconstructorarmadillo

解决方案


因为A<T>(for any T) 是 a vec3(因为继承),并且您是根据文档包含复制构造函数的构造函数,所以该using对象将很高兴从任何对象复制构造。vec3A<T> vec3

当您将构造函数using arma::vec3::vec3复制到类中而不进行修改时,它基本上会创建一个构造函数,而不是构造函数。vec3A<T>A(const vec3&)A(const A&)


当您没有该using部分时,编译器自动生成的复制构造函数将是A<T>该类唯一可用的复制构造函数,它将是A(const A&).


推荐阅读