Better C++ syntax for template base class typedefs and functions?
我有代码,用VC9(微软Visual C++ 2008 SP1)编译,但不与GCC 4.2(在MAC上,如果这很重要)。如果我堆积了足够多的限定符和关键字,我可以强制它在gcc中工作,但这似乎不正确。
下面是显示我的问题的最小代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | template< typename N > struct B { typedef N n_type; // can derived class access typedef? void foo() {} // can derived class access function? }; template< typename N > struct D : public B<N> { typedef B<N> b_type; typedef typename b_type::n_type bn_type; void f1( n_type ) {} // ERROR: 'n_type' has not been // declared void f2( typename B<N>::n_type ) {} // OK, verbose void f3( b_type::n_type ) {} // ERROR: 'struct B<N>::n_type' is // not a type void f4( typename b_type::n_type ) {} // OK, verbose void f5( bn_type ) {} // OK, verbose typedefs void f6() { foo(); } // ERROR: there are no arguments to // 'foo' that depend on a template // parameter, so a declaration of // 'foo' must be available void f7() { b_type::foo(); } // OK, verbose }; |
我是否错误地期望从另一个模板类派生的模板类能够直接使用继承的typedef和函数?有没有比我现在想出的更好的方法?
Am I wrong to expect a template class derived from another template class to be able to use inherited typedefs and functions directly?
是的,这通常不会像您期望的那样工作。C++名称查找规则指定仅在模板化基类中搜索名称,如果它依赖于模板参数(如果它是"依赖名称")。如果名称不依赖于模板参数,则不会在其中搜索。(也见这个C++ FAQ Lite条目)
要从从属基类调用函数,最简单的方法是使用
1 | void f6() { this->foo(); } |
请参阅C++ FAQ Lite版35.18-20和C++模板常见问题解答。
两个阶段名称查找是C++中一个棘手的部分,许多编译器(和编码器)出错。只要说,GCC比MSVC在这里更正确(按照C++规范),没有,没有更好的方法来做你想做的事情。
没有n_类型。有(或可能有)一个类型的名称依赖于n。所以不,您不能做您想要的。
下面有几个链接可以帮助理解为什么需要使用
似乎海湾合作委员会"做得对"