2012-03-30 5 views
0
template<int n> 
struct Numberim{ 
    enum{ value = Numberim<n-1>::value + n }; 
}; 

template<> 
struct Numberim<0>{ 
    enum{ value = 0 }; 
}; 

Dies ist ein einfaches tmp Beispiel, und es ist in Ordnung;Unterschied zwischen Struktur und Klasse, wenn Vorlage Meta-Programmierung

template<int n> 
class Numberim{ 
    enum{ value = Numberim<n-1>::value + n }; 
}; 

template<> 
class Numberim<0>{ 
    enum{ value = 0 }; 
}; 

ich g ++ kompilieren, und es beschwert ... aber soweit ich weiß, Struktur und Klasse ist fast in der gleichen way.just wie diese "In C++, den einzigen Unterschied zwischen einem behandelt struct und eine Klasse ist, dass Strukturmitglieder standardmäßig öffentlich sind und die Klassenmitglieder standardmäßig privat sind. "

Also, was ist der Unterschied zwischen ihnen hier auf der Erde?

+1

'es beschwert sich.- wie beklagt es sich? –

+0

Warum denken Sie, dass es einen Unterschied gibt? – josephthomas

+0

@Jesse die g ++ sagt so "Fehler: 'Nummerim <22> :: Nummerim <22> :: Wert' ist privat", nun ... Ich denke, ich bin naiv, diese Frage zu stellen. Danke. –

Antwort

3

Der Unterschied ist der gleiche wie für die Klasse vs Struktur. Ihr "Wert" ist öffentlich für Ihr erstes Beispiel (mit struct) und privat für Ihr zweites Beispiel (mit Klasse).

Eine Referenz auf den Unterschied zwischen einer Klasse und einer Struktur finden Sie unter What are the differences between struct and class in C++.

0

Betonklasse Numberim<1> ist nicht mit Beton Klasse Numberim<0> verwandt.

So mit einer Klasse beziehen sich auf die andere ’ Definition von value funktioniert, wenn valuepublic ist, die es für die struct ist, aber nicht, wenn value ist private, die es für die class ist.

Sie können den friend Mechanismus, oder Sie können value öffentlich machen, oder Sie können, viel einfacher, dies tun:

template<int n> 
class Numberim{ 
    enum{ value = n*(n+1)/2 }; 
    // And whatever else you want in here. 
}; 
0

Der Unterschied ist immer noch das gleiche, wenn er versucht, Numberim<n-1>::value zu kompilieren mit n=1 versucht es, die Template-Spezialisierung zu verwenden. Da value jedoch private Mitglied von Numberim<0> ist (da die Klassenmembervariablen private standardmäßig sind) gibt es den Compilerfehler.

Verwandte Themen