У меня есть базовый класс шаблона:
template<typename T, std::size_t Size>
class VectorT
{
public:
typedef T data_type;
}
и несколько специализированных производных классов:
template<typename T>
class Vector2d : public VectorT<T, 2U>
{ // some specialised functions }
template<typename T>
class Vector3d : public VectorT<T, 3U>
{ // some other specialised functions }
, и они работают нормально.Однако у меня есть несколько автономных функций для операторов.Например:
template<typename T, size_t Size>
VectorT<T, Size> operator*(T lhs, const VectorT<T, Size>& rhs)
{
...
}
К сожалению, они не работают для моих производных классов, потому что они возвращают VectorT<T, Size>
вместо Vector2d<T>
.
Так что я попытался с
template<V>
V operator*(typename V::data_type lhs, const V& rhs)
{
...
}
и это прекрасно работает, однако это может привести к неоднозначности, потому что это впитывает что-либо еще с членом data_type.
Как мне обойти это: как я могу написать безопасные функции типа, которые работают толькос моей векторной базой или какими-либо производными от?
Я пытаюсь обойти необходимость повторного объявления и переопределения операторов снова для подклассов.