Diese Frage bezieht sich auf meine letzte one. Ich versuche das Problem mit traits<T>
und traits<T*>
zu lösen. Bitte beachten Sie den folgenden Code.Verwenden von Merkmalen in C++
template<typename T>
struct traits
{
typedef const T& const_reference;
};
template<typename T>
struct traits<T*>
{
typedef const T const_reference;
};
template<typename T>
class test
{
public:
typedef typename traits<T>::const_reference const_reference;
test() {}
const_reference value() const {
return f;
}
private:
T f;
};
int main()
{
const test<foo*> t;
const foo* f = t.value(); // error here. cannot convert ‘const foo’ to ‘const foo*’ in initialization
return 0;
}
So sieht es aus wie Compiler nicht die Züge Spezialisierung für Zeiger unter Berücksichtigung und Rückgabetyp value()
als const foo
statt const foo*
nehmen. Was mache ich hier falsch?
Jede Hilfe wäre großartig!
Ich fühle dump :(Aber, T selbst ist ein Zeiger ('foo *'). Also die Angabe von 'T *' wird in 'T **' führen? –
Nein. In der 'Traits' Spezialisierung, 'T 'ist kein Zeiger,' T * 'ist ein Zeiger. Dass Sie den gleichen typename Parameter verwenden, ist belanglos. –
outis
OK. Danke. Es macht jetzt Sinn. –