首页 > 解决方案 > 如何解决不合格名称查找问题

问题描述

我有以下简化程序:

class Base { };

template < typename T >
class X: public T
{
    public:
        using TOP = T;
};

// with dependent template parm    
template < typename T >
class Y: public X< T >
{
    // I have to write down the full name of the base class
    using X<T>::TOP::operator =;
};

// without depending template parameter
template < typename T >
class Y: public X< Base >
{
    // I simply can use the defined type from the base class
    using TOP::operator =;
};


int main()
{
    Y< Base > y ;
}

现在的问题是,是否有任何方法可以简化基类类型的完全重复。我的原始代码是这样的:

template < typename VAR_TYPE >
class VarObserved: public ConstructAll2<
                   UsingHelperV_None,
                   UsingHelper_None,
                   CONTAINERL< AssignConst >,
                   CONTAINERL< Print >,
                   CONTAINERL< DataStore >,
                   CONTAINERL< Distribute_ >,
                   CONTAINERL< EndForward >,
                   CONTAINERSP< DataStoreBase, VAR_TYPE >
                   >
{
    public:
        using SELF = ConstructAll2<
            UsingHelperV_None,
            UsingHelper_None,
            CONTAINERL< AssignConst >,
            CONTAINERL< Print >,
            CONTAINERL< DataStore >,
            CONTAINERL< Distribute_ >, 
            CONTAINERL< EndForward     >,
            CONTAINERSP< DataStoreBase, VAR_TYPE >   // see text 1)
                >;

        VarObserved( const VAR_TYPE& var ): SELF{{ var }}{}
        using SELF::AssignConst::operator=;
};

如您所见,所有模板参数的完全重复并​​不是很“好”。有机会解决吗?

如果上面的代码没有依赖模板参数(将单行 1.))从上面的示例更改为:

CONTAINERSP< DataStoreBase, int>

该类变得非常简单并且更易于维护:

...
VarObserved( const VAR_TYPE& var ): ConstructAll2{{ var }}{}
using AssignConst::operator=;
....

作为对潜在问题的参考,我已经发现了那个问题

模板和继承的“未在此范围内声明”错误

但不知道简化我的代码。

标签: c++templatesunqualified-name

解决方案


现在的问题是,是否有任何方法可以简化基类类型的完全重复。

要查找TOP在依赖基类中声明的名称,您可以编写Y::TOP代替X<T>::TOP,尽管这可能会使读者感到困惑,您可能应该评论一下为什么要这样做。

之所以可行,是因为它不再是不合格的查找。请注意,您不需要在这里写出模板参数(Y是注入的类名,与 的含义相同Y<T>)。


推荐阅读