On Wed, Mar 4, 2009 at 9:12 PM, Simon Hill <yacw...@gmail.com> wrote: > g++ doesn't seem able to match a template ctor of a template class > where the ctor input is an internal class defined inside any template > class. > > I briefly skimmed the titles of the current regression issues and I > didn't notice any that matched this, but I'm not 100% sure. > > I first posted this here thinking it was my code that was somehow wrong. > http://www.gamedev.net/community/forums/topic.asp?topic_id=526736 > > demo.cpp > ======================== > template <typename T> > class CFoo > { > public: > class CZep {}; > > CFoo(int); // line 7. > template <typename Z> CFoo(typename CFoo<Z>::CZep); // ## ctor I want ## > ~CFoo(); > > CZep zep(); > }; > > > int main() > { > CFoo<int> x(1); > CFoo<int>::CZep z; > CFoo<int> w(z); // line 19: ## should call the ctor on line 8 ## > > return 0; > } > > ======================== > > g++ demo.cpp > ======================== > demo.cpp: In function ‘int main()’: > demo.cpp:19: error: no matching function for call to > ‘CFoo<int>::CFoo(CFoo<int>::CZep&)’ > demo.cpp:7: note: candidates are: CFoo<T>::CFoo(int) [with T = int] > demo.cpp:3: note: CFoo<int>::CFoo(const CFoo<int>&) > ======================== > > Specs: > g++ [4.4.0] > ubuntu [ibex, 64] > > > This compiles fine on 3.3.2 and MSVC according to other testers at > gamedev.net. > > > Note: In the above example CZep is inside CFoo, but it doesn't matter > if you put CZep inside class CBar<T> {} instead, just as long as it's > inside another template class. > > > > Does the above code compile OK on other people's 4.4.0s? or is it a bug?
EDG says t.C(8): warning #488: template parameter "Z" is not used in declaring the parameter types of function template "CFoo<T>::CFoo<Z>(CFoo<Z>::CZep)" template <typename Z> CFoo(typename CFoo<Z>::CZep); // ## ctor I want ## ^ t.C(8): warning #488: template parameter "Z" is not used in declaring the parameter types of function template "CFoo<T>::CFoo<Z>(CFoo<Z>::CZep) [with T=int]" template <typename Z> CFoo(typename CFoo<Z>::CZep); // ## ctor I want ## ^ detected during instantiation of class "CFoo<T> [with T=int]" at line 17 t.C(19): error: no instance of constructor "CFoo<T>::CFoo [with T=int]" matches the argument list argument types are: (CFoo<int>::CZep) CFoo<int> w(z); // line 19: ## should call the ctor on line 8 ## ^ compilation aborted for t.C (code 2) MSVC wasn't ever a good source of C++ validity testing. Basically during instantiation of CFoo<int> the templated constructor is not instantiated and thus not found. Richard.