I gave this presentation on Nov 17 at the Northwest C++ Users Group. Here are the links to the two-part video:
There was an unresolved discussion about one of the examples–the one about template specialization conflicting with modular type checking. It turns out the example was correct (that is an error would occur).
template<class T> struct vector { vector(int); // has constructor }; //-- This one typechecks template<LessThanComparable T> void f(T x) { vector<T> v(100); ... } //-- Specialization of vector for int template<> struct vector<int> { // missing constructor! }; int main() { f(4); } // error
The issue was whether the instantiation of f
in main
would see the specialization of the vector
template for int
even though the specialization occurs after the definition of f
. Yes, it would, because vector<T>
is a dependent name inside f
. Dependent names are resolved in the context of template instantiation–here in the context of main
, where the specialization is visible. Only non-dependent names are resolved in the context of template definition.
Leave a Reply