C++ 使用别名模板和继承进行显式析构函数调用
受这个问题及其答案的启发,我一直在尝试在代码中也这么做。不幸的是,以下MWEC++ 使用别名模板和继承进行显式析构函数调用,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>
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();
}