受到问题及其答案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 ++,或者这是否是编译器中的错误。你看到了解决方法吗?
答案 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