2013-09-26 80 views
3

C++ STL容器不允許用不完整類型實例化;這是未定義的行爲。欺騙以允許模板中的不完整類型?

這是一個有效的「訣竅」來解決這個限制嗎?或者這個技巧還有未定義的行爲?

#include <vector> 

template<template<class, class> class Vector = std::vector> 
struct my_incomplete_vector 
{ 
    struct Element; 

    // Element is incomplete here, but does it matter anymore? 
    typedef Vector<Element, std::allocator<Element> > type; 

    struct Element { typename type::iterator value; }; 
}; 

int main() 
{ 
    my_incomplete_vector<>::type v; 
    v.resize(1); 

    // this isn't normally possible without incomplete types 
    v[0].value = v.begin(); 
    return 0; 
} 
+2

您不「將容器存儲」。您將* objects *存儲在容器中。 –

+0

@KerrekSB:我解決了,但你的意思? – Mehrdad

+0

這個問題是空洞的,因爲它是......爲什麼天空由磚等製成 –

回答

4

這是未定義的行爲。該標準要求類型爲 ,如果它被用作模板的參數,則在實例化模板的 點處完成。 my_incomplete_vector::Element在內部使用 時不完整。當然,除非你實際上 實例化你的模板,否則不會發生任何問題,但是g ++無法用通常的調試選項 (-D_GLIBCXX_CONCEPT_CHECKS -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC)編譯 你的代碼。

+0

這不就是'struct T {T * p;}'嗎? 'T'不完整,但可以定義一個指針/迭代器嗎? –

+0

@JohnSmith類型不一定要完整纔能有一個指向它的聲明。 –

+0

@John史密斯編號struct T {T * p; }'與模板參數的要求無關。爲了聲明'type :: iterator'類型的變量,'type'必須被實例化。標準說,當一個模板被實例化時,類型被實例化,必須是完整的(有幾個例外)。我沒有看到與指針的任何關係。 –