gma*_*dau 5 c++ destructor typedef
我有以下内容:
template <typename X> struct A {
typedef X _X;
};
template <typename Y> struct B { // Y is struct A
typename Y::_X x;
void call_destructor () {
x.~Y::_X(); // This doesn't work
x.Y::~_X(); // This as well
}
};
Run Code Online (Sandbox Code Playgroud)
这不会编译,说
限定类型与析构函数名称不匹配
typename在通话之前使用关键字也不起作用.但是,以下编译:
template <typename Y> struct B {
typename Y::_X x;
typedef typename Y::_X __X;
void call_destructor () {
x.~__X(); // This works
}
};
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释为什么,有没有办法让没有typedef?
你应该使用不同的方式调用析构函数
x.Y::_X::~_X()
Run Code Online (Sandbox Code Playgroud)
以下编译对我来说很好:
template <typename X> struct A {
typedef X _X;
};
template <typename Y> struct B { // Y is struct A
typename Y::_X x;
void call_destructor () {
x.Y::_X::~_X(); // This as well
}
};
int main(){
B<A<int> > b;
b.call_destructor();
}
Run Code Online (Sandbox Code Playgroud)
x.~Y::_X(); // This doesn\'t work\nRun Code Online (Sandbox Code Playgroud)\n\n是一个语法错误,我相信编译器将其解析为_X调用~Y
在第二种情况下,当您调用包含的析构函数\xe2\x80\xa0时::时,最后两个类型名称必须表示相同的类型
s.A::~B();\nRun Code Online (Sandbox Code Playgroud)\n\n其中A和B必须是同一类型。A和B都在先前说明符指定的范围内查找(如果有)
x._X::~_X(); // error, can\'t find _X in current scope\nRun Code Online (Sandbox Code Playgroud)\n\n逻辑上的修复是
\n\nx.Y::_X::~_X(); // error, _X is dependent name\nx.typename Y::_X::~_X(); // error, typename cannot be here\nRun Code Online (Sandbox Code Playgroud)\n\n由于Y::_X是一个从属名称,typename因此需要消除它作为类型的歧义,但析构函数的语法不允许typename表达式中包含 a 。最终结果是您必须使用类型别名
using X = typename Y::_X;\nx.~X();\nRun Code Online (Sandbox Code Playgroud)\n\n另一方面,编写并忘记析构函数调用的最简单方法就是
\n\nx.~decltype(x)();\nRun Code Online (Sandbox Code Playgroud)\n\n但是 gcc 和 msvc 无法编译它。
\n\n\xe2\x80\xa0 更准确地说,伪析构函数调用
\n