कि फू मान लिया जाये कि कुछ इस तरह परिभाषित किया गया है:
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;
};
फिर, यह सुनिश्चित करने के फू के ग्राहकों m_value को संशोधित नहीं में (मुझे लगता है कि यह है कि क्या द्वारा "मैं एक रहा हूँ मतलब है कॉल करने के लिए सुनिश्चित करें foo की टी ") नहीं बदलेगा तरह, आप अपने टेम्पलेट पैरामीटर के बजाय const-अर्हता प्राप्त करने के फू वस्तु की जरूरत है, यानी
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>&
।
यहाँ एक पूर्ण, compilable उदाहरण है:
#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
}
स्रोत
2010-02-18 17:08:58
आप शायद यह सुनिश्चित करने की कोशिश कर रहे हैं कि कॉलर foo के * f * को नहीं बदलेंगे। –