2017-08-25 30 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

相關問題