У меня есть следующие два класса (надуманный пример):
#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 нарушает мой код ( не выкидывает ошибку)? Спасибо