2015-12-09 19 views
6

Come risposta qui: How can an incomplete type be used as a template parameter to vector here? l'utilizzo di tipo incompleto come argomento modello quando l'istanziazione di un componente del modello può comportare un comportamento non definito. Ma questa regola è vera quando abbiamo solo il puntatore/riferimento al componente del template con tipo incompleto come argomento? Anche in questo caso avviene l'instatia?Riferimento o puntatore a std :: vettore di tipo incompleto

Ad esempio:

// SomeAlgoInterface.hpp 

#include <vector> 

struct Result; // forward declaration 

class SomeAlgoInterface 
{ 
    public: 

    virtual ~SomeAlgoInterface() = default; 

    public: 

    // the following line is definitely OK, ... 
    virtual void f1(const Result & result) = 0; 

    // ... but I'm not quite sure about the following one 
    virtual void f2(const std::vector<Result> & results) = 0; 
}; 

In altre parole, è il codice di cui sopra valido o no?

+2

Secondo gli esempi in [temp.inst]/4 , questa dichiarazione non causa l'istanziazione –

risposta

2

La dichiarazione è corretta, purché non si chiami f2.

Il compilatore non ha bisogno di conoscere l'interno della classe Result se non si chiama f2. Non c'è allocazione di memoria nella dichiarazione.

Se qualche unità di compilazione chiamata f2, è necessario fornire il tipo completo per Result di classe, o avete bisogno di un altro parametro di riferimento per chiamare f2:

void another_f(SomeAlgoInterface& i, std::vector<Result>& results) 
{ 
    i.f2(results); 
} 
+0

Non sono così sicuro che la chiamata di questo richiede istanziazione se ancora non si utilizza nulla nella classe, ad esempio nel tuo esempio se 'i.f2' ha accettato anche il vettore per riferimento –

Problemi correlati