Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用别名模板和继承进行显式析构函数调用_C++_Templates_C++11_Inheritance_Destructor - Fatal编程技术网

C++ 使用别名模板和继承进行显式析构函数调用

C++ 使用别名模板和继承进行显式析构函数调用,c++,templates,c++11,inheritance,destructor,C++,Templates,C++11,Inheritance,Destructor,受这个问题及其答案的启发,我一直在尝试在代码中也这么做。不幸的是,以下MWE template<class T> using alias = T; class Yo { public: ~Yo() { } }; template<class A> class Lo { protected: A a; }; template<class A> class Foobar : public Lo<A>

受这个问题及其答案的启发,我一直在尝试在代码中也这么做。不幸的是,以下MWE

template<class T>
using alias = T;

class Yo {
    public:
        ~Yo() { }
};

template<class A>
class Lo {
    protected:
        A a;
};

template<class A>
class Foobar : public Lo<A> {
    public:
        typedef Lo<A> super;
        inline void expl() {
                super::a.~alias<decltype(super::a)>();
        }
};

int main() {
    Foobar<Yo> A;
    A.expl();
}
模板
使用别名=T;
溜溜球{
公众:
~Yo(){}
};
模板
Lo类{
受保护的:
A A;
};
模板
Foobar类:公共Lo{
公众:
typedef-Lo-super;
内联void expl(){
超级::a.~alias();
}
};
int main(){
福巴A;
A.expl();
}
用g++编译很好,但用clang我可以

mwe.cpp:20:27:错误:“模板”关键字后面的“别名” 不引用模板

使用icpc,我可以

cpp(20):内部错误:指针错误


我不确定这是否正确C++,或者如果这是编译器里面的一个bug。你看到解决办法了吗?

我找到了一种方法让它起作用。但要做到这一点,我必须将Lo类中的变量a公开

 template<class T>
 using alias = T;

class Yo {

public:
    ~Yo() { }
};

template<class A>
class Lo {
public:
    A a;
};

template<class A>
class Foobar : public Lo<A> {
public:
    typedef Lo<A> super;

    using type = alias<decltype(super::a)>;

    inline void expl() {
            super::a.~type();
    }
};

int main() {
   Foobar<Yo> A;
   A.expl();
}
模板
使用别名=T;
溜溜球{
公众:
~Yo(){}
};
模板
Lo类{
公众:
A A;
};
模板

类Foobar:public Lo

在我看来,
别名
应该在
Yo
类中定义,否则就找不到它,因为它不是在该类中查找名称的范围(类本身及其基类)的成员,而该范围是使用
clang
编译的,但是不再使用
g++
了。这种情况下是否可以使用
template
关键字来消除歧义?“不可否认,我看不出这是怎么回事。”PiotrS说。这里的伪析构函数名是
alias()
。可以说,此名称不包含嵌套的名称说明符,因此[basic.lookup.qual]p6不适用。谢谢,但不幸的是,我无法在我的整个应用程序中进行此更改。请告诉我,我关于变量类型的断言是否在您的应用程序中始终有效?在您的应用程序中,此解决方案适合我的应用程序。现在我仍然在想初始代码是否是C++的有效代码。
using type = alias<A>;

inline void expl() {
        super::a.~type();
}