Предполагая, что Foo определено примерно так:
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;
};
Затем, чтобы гарантировать, что клиенты Foo не изменяют m_value (я предполагаю, что это то, что подразумевается под "Я ищу"способ гарантировать, что вызывающие абоненты не изменят T of foo "), вам нужно const-квалифицировать объект Foo, а не его параметр шаблона, т.е.
Foo<int> x(1);
x.setValue(2); // OK
const Foo<int> y(1);
y.setValue(2); // does not compile
Следовательно, ваша функция get_foo должна возвращать const Foo<T>&
, а не const Foo<const T>&
.
Вот полный, компилируемый пример:
#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
}