
John Maddock wrote:
No, you're not specializing a function template. You're adding an overload. My standardese is rusty, but I don't think that's allowed in namespace std.
That's my understanding too: overloading std namespace functions is forbidden by the std. And while possibly convenient, why would one expect "get" to be in namespace std when array is in namespace boost?
IMO the correct solution (at least as far as the std is concerned) is to call "get" unqualified and let ADL do it's magic.
As for ADL, function calls with explicit template arguments are different with (ordinary) function calls without them: To make ADL kick in when calling a function call with explicit template arguments, a function template with the **same name** should be visible at the point of the call. See the standard 14.8.1.6. So we need something like this: namespace adl_helper { namespace detail { template <typename T> struct always_false : boost::mpl::bool_<false> {}; } template <typename T> typename boost::enable_if<detail::always_false<T> >::type get(); } int main() { boost::array<int, 3> ar = {{1, 2, 3}}; using adl_helper::get; std::cout << get<1>(ar) << std::endl; } Anyway, std::get overloads done in boost/array.hpp should be removed. Regards, Michel