使用引用基类的成员模板的声明。

时间:2010-08-16 13:01:56

标签: c++ templates

任何人都可以解释这个

 "A using-declaration in a derived class cannot refer to a specialization 
 of a template conversion function in a base class."

来自ISO C ++标准..14.5.2,第7点

2 个答案:

答案 0 :(得分:5)

这意味着这是不正确的:

struct A { template<typename T> operator T(); };
struct B : A { using A::operator int; }; // ill-formed: refers to specialization

同样适用于其他功能模板专业化(不仅仅是转换功能)

struct A { template<typename T> void f(); };
struct B : A { using A::f<int>; }; // ill-formed: refers to specialization

答案 1 :(得分:-1)

2.)

Q: My compiler says that a member of a base class template is not defined in a derived class template. Why is it not inherited?

template<typename T>
class base {
public:
    void base_func();
};

template<typename T>
class derived : public base<T> {
public:
    void derived_func()
    {
        base_func(); // error: base_func not defined
    }
};

A: 
It is inherited. 
However, the standard says that unqualified names in a template are generally non-dependent and must be looked up when the template is defined. 
Since the definition of a dependent base class is not known at that time (there may be specialisations of the base class template that have not yet been seen), 
unqualified names are never resolved to members of the dependent base class. 
Where names in the template are supposed to refer to base class members or to indirect base classes, 
they can either be made dependent by qualifying them or brought into the template's scope with a using-declaration. 
In the example, this could be achieved by replacing the call to base_func() with this->base_func() or base<T>::base_func(), or by adding the declaration using base<T>::base_func;.

我从这个页面得到的是,要从父模板类中引入一个类,你必须使用看起来像base<T>::base_func()的using-declaration,ISO标准所说的是你不能使用这样的使用声明base<int>::base_func()。差异在&lt;&gt;。

之间