gpt4 book ai didi

c++ - 使用别名模板和继承的显式析构函数调用

转载 作者:太空狗 更新时间:2023-10-29 23:01:21 25 4
gpt4 key购买 nike

受到问题及其答案的启发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: error: 'alias' following the 'template' keyword does not refer to a template

有了 icpc,我得到了

mwe.cpp(20): internal error: bad pointer

我不确定这是正确的 C++,还是编译器内部的错误。您看到解决方法了吗?

最佳答案

我找到了一种让它发挥作用的方法。但要这样做,我必须将 Lo 类中的变量 a 设为 public

 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,它将传递给父类(super class) Lo。所以变量 a 具有您在模板中获得的类型!所以你可以简单地做:

using type = alias<A>;

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

现在你可以拥有一个 protected 变量a link

关于c++ - 使用别名模板和继承的显式析构函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31446606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com