带有别名模板和继承的显式析构函数调用

时间:2015-07-16 06:19:53

标签: c++ templates c++11 inheritance destructor

受到问题及其答案Calling destructor with decltype and\or std::remove_reference的启发,我一直试图在我的代码中做同样的事情。不幸的是,以下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();
}

用g ++编译好,但是我得到了clang

  

mwe.cpp:20:27:错误:'template'关键字后面的'别名'   没有引用模板

使用icpc,我得到了

  

mwe.cpp(20):内部错误:错误的指针

我不确定这是否是正确的C ++,或者这是否是编译器中的错误。你看到了解决方法吗?

1 个答案:

答案 0 :(得分:1)

我找到了让它有效的方法。但要这样做,我必须在Lo class public

中创建变量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();
}
编辑我只想到了什么

在Foobar类中,您将获得一个模板参数A,该模板将被传递给超类Lo。所以变量a具有模板中的类型! 所以你可以这样做:

using type = alias<A>;

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

现在您可以拥有一个受保护的变量link