Почему следующий код дает ошибку компилятора без шаблона с именем make_static_vector
?Определение шаблона функции друга внутри класса шаблона
template<class Tuple>
class vector;
template<typename T, std::size_t N>
using static_vector = vector<std::array<T, N>>;
template<class Tuple>
class vector
{
private:
using value_type = std::decay_t<decltype(std::declval<Tuple&>().operator[](0))>;
template<typename T, typename... Elements>
friend static_vector<T, sizeof...(Elements)> make_static_vector(Elements&&... elements) {
return { std::forward<Elements>(elements)... };
}
template<typename... Elements>
vector(Elements&&... elements)
: m_elements{ static_cast<value_type>(std::forward<Elements>(elements))... }
{ }
Tuple m_elements;
};
int main()
{
make_static_vector<double>(1, 1);
return 0;
}
Я создал a live demo of the code. Он работает, когда я перемещаю определение make_static_vector
вне класса и оставляю только часть декларации внутри класса.
Почему невозможно определить функцию непосредственно внутри класса?
«это работает, когда объявлено вне класса», на самом деле. Нарушения ODR - это не весело. –
@ T.C. Я предполагал, что будет только одно определение, как он отметил в вопросе. Я прояснил это. – Niall