// based on test-wrapper.cpp

#include <iostream>
#include <string>

template <typename T> class foo {
public:
	T id;
	void setId(T iniName) {
		id = iniName;
	}
};

template <typename T> struct foowrapper {
	foo<T> const & objFoowrapper;
};

template <typename T, typename U> foowrapper<T> print(foo<U> const & objprint) {
	return {objprint}; // without curly brackets: error: conversion from ‘const foo’ to non-scalar type ‘foowrapper’ requested
}

template <typename T> std::ostream & operator<<(std::ostream & lhs, foowrapper<T> const & rhs) {
	lhs << '[' << rhs.objFoowrapper.id << ']';
}

int main() {
	foo<std::string> f;
	f.setId("blah");

	std::cout << print(f);
}
