Если это должен быть глобальный метод, который служит конструктором, тогда вы можете сделать следующее:
внутри stack.h
класс вставьте объявление друга для этого глобального метода, например:
template <typename T>
class stack {
template <typename U, typename IterIt>
friend stack<U> construct(IterIt beg, IterIt end);
private:
T* inside_;
};
В stack.cpp теперь мы можем определить этот метод построения:
#include "stack.h"
#include <cstddef>
template <typename T, typename IterIt>
stack<T> construct(IterIt beg, IterIt end) {
// warning: works only with iterators defining binary operator-
stack<T> result;
size_t elems = end - beg;
result.inside_ = new T[elems];
T* add_to = result.inside_;
while (beg != end) {
*add_to = *beg;
++add_to;
++beg;
}
return result;
}
И с простым основным методом вы можете иметь:
int main() {
int a[] = {1,2,3,4,5};
stack<int> s = construct<int>(a, a + 5);
}
Надеюсь, это решит вашу проблему. Помните, что могут быть некоторые угловые случаи, которые вам нужно будет решить, но в качестве основы я думаю, что этого должно быть достаточно.