Zakładając, że Foo jest zdefiniowane tak:
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;
};
Następnie, w celu zapewnienia, że klienci Foo nie zmieniają m_value (zakładam, że to, co należy rozumieć przez „ja szukam sposób, aby zapewnić rozmówców nie zmieni t foo "), trzeba const zakwalifikować obiekt foo raczej niż jego parametr szablonu, czyli
Foo<int> x(1);
x.setValue(2); // OK
const Foo<int> y(1);
y.setValue(2); // does not compile
Dlatego czynność get_foo powinien zwrócić const Foo<T>&
, a nie const Foo<const T>&
.
Oto kompletny, compilable przykład:
#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
}
Prawdopodobnie próbujesz upewnić się, że rozmówcy nie zmienią * f * foo. –