我的代码可以在 VC9 (Microsoft Visual C++ 2008 SP1) 中正常编译,但不能在 GCC 4.2 中编译(在 Mac 上,如果这很重要的话)。如果我堆积足够的限定符和关键字,我可以强制它在 GCC 中工作,但这似乎不对。
这是展示我的问题的最小代码示例:
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 和函数是错误的吗?有没有比我迄今为止想出的更好的方法来做到这一点?
我期望从另一个模板类派生的模板类能够直接使用继承的 typedef 和函数是错误的吗?
是的,这通常不会像您期望的那样工作。 C++ 名称查找规则指定仅在依赖于模板参数的名称(如果它是“从属名称”)时才在模板化基类中搜索该名称。如果名称不依赖于模板参数,则不会在那里搜索它。 (另请参阅这个 C++ FAQ Lite 条目 http://www.parashift.com/c++-faq-lite/templates.html#faq-35.19)
要从依赖基类调用函数,最简单的方法是使用this->
, since this
始终隐式地是一个从属名称:
void f6() { this->foo(); }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)