Giả sử rằng Foo được định nghĩa như thế này:
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;
};
Sau đó, để đảm bảo rằng khách hàng của Foo không sửa đổi m_value (Tôi cho rằng đây là những gì có nghĩa là "Tôi đang tìm kiếm một cách để đảm bảo những người gọi sẽ không thay đổi T của foo "), bạn cần phải const đủ điều kiện đối tượng foo chứ không phải là tham số mẫu của nó, tức là
Foo<int> x(1);
x.setValue(2); // OK
const Foo<int> y(1);
y.setValue(2); // does not compile
Do đó, chức năng get_foo bạn nên trả về một const Foo<T>&
, không phải là một const Foo<const T>&
.
Dưới đây là một hoàn thành, compilable dụ:
#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
}
Nguồn
2010-02-18 17:08:58
Có thể bạn đang cố gắng đảm bảo rằng người gọi sẽ không thay đổi * f * của foo. –