gpt4 book ai didi

c++ - 如果模板构造函数参数是从非模板基类(Armadillo)派生的,它们似乎并不关心它们的类型。

转载 作者:行者123 更新时间:2023-12-02 09:53:52 25 4
gpt4 key购买 nike

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

#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.

我不是模板专家,也不了解 Armadillo vector 库的内部工作原理,但是谁能想到任何原因导致继承arma::vec3构造函数破坏我的代码(不抛出错误)?谢谢

最佳答案

因为A<T>(对于任何T)都是vec3(由于继承),并且您是usingvec3构造函数,根据the documentation包括复制构造函数,所以A<T>对象将很乐意从任何vec3对象进行复制构造。

当您执行using arma::vec3::vec3时,您是在不做任何修改的情况下将vec3构造函数复制到A<T>类中,它基本上是创建一个A(const vec3&)构造函数,而不是A(const A&)构造函数。

当您没有using部分时,编译器自动生成的copy-constructor将是A<T>类可用的唯一副本构造器,它将是A(const A&)

关于c++ - 如果模板构造函数参数是从非模板基类(Armadillo)派生的,它们似乎并不关心它们的类型。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62015510/

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