Access is defined for a ref, but a const ref is required because the calling member function of Value<int> is const (and so it's data must be const protected). Brian On Mon, Feb 22, 2010 at 5:45 PM, burlen <burlen.loring@xxxxxxxxx> wrote: > Hi, > > I'm getting the error that gcc cannot match my templated member function > call. I'm not seeing where the ambiguity lies, can someone explain why g++ > doesn't find it? > > Here are the error > > $g++ minimal.cpp > minimal.cpp: In member function ‘T Value<T>::GetValue() const [with T = > int]’: > minimal.cpp:59: instantiated from here > minimal.cpp:46: error: no matching function for call to > ‘ValueTraits<int>::Access(const ValueUnion&) const’ > minimal.cpp:24: note: candidates are: int > ValueTraits<int>::Access(ValueUnion&) const > > > Here is the code from minimal.cpp: > > #include <iostream> > using std::cerr; > using std::endl; > > //============================================================================= > typedef union > { > int Int; > double Double; > } > ValueUnion; > > //============================================================================= > template <typename T> > class ValueTraits {}; > > //============================================================================= > template<> > class ValueTraits<int> > { > public: > int Access(ValueUnion &vu) const { return vu.Int; } > void Assign(ValueUnion &vu, int val){ vu.Int=val; } > }; > > //============================================================================= > template<> > class ValueTraits<double> > { > public: > double Access(ValueUnion &vu) const { return vu.Double; } > void Assign(ValueUnion &vu, double val){ vu.Double=val; } > }; > > //============================================================================= > template<typename T> > class Value > { > public: > virtual T GetValue() const { return this->Traits.Access(this->Data); } > virtual void SetValue(T data) { this->Traits.Assign(this->Data,data); } > > private: > ValueTraits<T> Traits; > ValueUnion Data; > }; > > //----------------------------------------------------------------------------- > int main(int argc, char **ragv) > { > Value<int> iv; > iv.SetValue(2); > cerr << "iv=" << iv.GetValue() << endl; > > Value<double> dv; > dv.SetValue(2.2); > cerr << "dv=" << dv.GetValue() << endl; > > return 0; > } > > >