2017-08-25 120 views
3

我有以下几点:C++:显式调用模板参数的类型定义的析构函数

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 
    } 
}; 

不编译,说

限定的类型不匹配析构函数名

在通话之前使用关键字typename也不起作用。但是,下列情况编译:

template <typename Y> struct B { 
    typename Y::_X x; 
    typedef typename Y::_X __X; 
    void call_destructor() { 
     x.~__X(); // This works 
    } 
}; 

有人能向我解释为什么,有没有什么办法让离不开typedef

回答

2
x.~Y::_X(); // This doesn't work 

是一个语法错误,我相信编译器解析它在呼唤_X~Y

原因第二个失败更有趣。

当调用一个析构与限定符(::),名称是从其中前述限定符驻留在的范围内,这意味着

x.Y::~_X(); 

查找名称_X在范围抬头其中Y驻留在其中,在这种情况下,它是全局范围。由于全局范围中没有_X,因此查找失败。

x.Y::_X::~_X(); 

查找在第一_X驻留在的范围内,这是Y范围的第二_X,因而找到合适的析构函数。

写即忘的析构函数调用的最简单方法就是

x.~decltype(x)(); 

但GCC和MSVC无法编译此。

†更确切地说,一个伪析构函数调用

4

你应该叫不同的使用

x.Y::_X::~_X() 

以下编译罚款,我的析构函数:

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(); 
} 
+0

有趣的是,这并不在锵的工作,虽然。我想知道这是一个错误还是有一些模糊的规则,为什么它不健康。 – Brian

+0

的确,我最初只是用gcc试过。这对我来说是个谜。 – Flynsee

相关问题