【发布时间】:2015-10-05 10:48:18
【问题描述】:
受问题及其答案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:错误:“模板”关键字后面的“别名” 不引用模板
有了 icpc,我得到了
mwe.cpp(20):内部错误:错误指针
我不确定这是否是正确的 C++,或者这是否是编译器内部的错误。您看到解决方法了吗?
【问题讨论】:
-
在我看来
alias应该在Yo类中定义,否则将找不到它,因为它不是查找名称的范围的成员(类本身及其基类) -
这与
clang一起编译,但不再与g++一起编译。 -
在这种情况下
template关键字可以用于消歧吗?诚然,我看不出它是如何工作的。 -
@PiotrS。这里的伪析构函数名称是
alias<..>()。可以说,此名称不包含嵌套名称说明符,因此 [basic.lookup.qual]p6 不适用。
标签: c++ templates c++11 inheritance destructor