Supponendo che Foo è definito qualcosa di simile:
template<typename T> class Foo
{
public:
Foo(const T& value) : m_value(value) { }
const T& getValue() const { return m_value; }
void setValue(const T& value) { m_value = value; }
private:
T m_value;
};
Poi, al fine di garantire che i clienti di Foo non modificano m_value (suppongo che questo è ciò che si intende per "Cerco un modo per garantire i chiamanti non cambierà la T di foo "), è necessario const-qualificare l'oggetto foo piuttosto che la sua parametro di template, cioè
Foo<int> x(1);
x.setValue(2); // OK
const Foo<int> y(1);
y.setValue(2); // does not compile
Pertanto, la funzione get_foo dovrebbe restituire un const Foo<T>&
, non un const Foo<const T>&
.
Ecco un completo, ad esempio compilabile:
#include <iostream>
template<typename T> class Foo
{
public:
Foo(const T& value) : m_value(value) { }
const T& getValue() const { return m_value; }
void setValue(const T& value) { m_value = value; }
private:
T m_value;
};
template<class T> class Owner
{
public:
Owner(const T& value) : m_foo(value) { }
Foo<T>& getFoo() { return m_foo; }
const Foo<T>& getConstFoo() const { return m_foo; }
private:
Foo<T> m_foo;
};
int main(int argc, char** argv)
{
Owner<int> x(1);
x.getFoo().setValue(2);
// x.getConstFoo().setValue(3); // will not compile
}
fonte
2010-02-18 17:08:58
Probabilmente stai cercando di assicurarti che i chiamanti non cambino il * f * di foo. –