Не должно быть никаких плохих эффектов как таковых, просто потеря функциональности.
Шаблон члена - это функция-член, которая является шаблоном, например:
struct foo
{
template <typename T>
void i_am_not_supported_sometimes(void);
};
Таким образом, вы не получаете неопределенного поведения или чего-либо еще, вы просто не можете программировать вещи самым общим образом. Я думаю, что окончательный ответ «это плохо» зависит именно от того, для чего он использовался, и каков был обходной путь.
Например, smart_ptr
, версия no-member-templates буквально просто удаляет шаблоны элементов, такие как:
template<class Y>
explicit shared_ptr( Y * p ): px( p ), pn( p ) // Y must be complete
{
boost::detail::sp_enable_shared_from_this( this, p, p );
}
И заменяет Y
на T
, так что вы теряете возможность некоторых автоматических преобразований.