类模板方法的定义
题目描述
我们通常这样编写函数:
void foo() {
// do something
}
像这样以{}代码块结尾的函数写法被称为函数的定义。定义包含了执行函数功能的所有信息:函数名,参数,返回值,以及如何实现(函数体),每一步代码的结果(类型)都是确定的。
但当存在函数间循环引用时,只使用函数定义语法就无法确定全部信息,导致编译失败:
void foo() { bar(); } // bar接受无参调用吗?它的返回值如何析构?
void bar() { foo(); }
因此,C/C++语言允许用;代替函数体,对函数进行声明:void bar();
就是一个对bar的声明。声明包含被使用所需的全部信息,隐去了实现的细节。只要声明过,对应的函数就可以调用,从而解决了循环引用问题。
然而,如果对应函数被调用,我们仍需要定义具体实现。补充get的实现,使程序正常运行,输出预期结果。
关于输入
无
关于输出
见样例输出
参考答案
#include <iostream>
#include <string>
template <typename T>
class Value {
T value;
public:
Value(T v) : value(v) {}
const T& get() const;
template <typename U>
void set(U v) {
value = v;
}
};
int main() {
Value v1(42);
Value<double> v2(3.14);
Value<std::string> v3("Hello, world");
std::cout << v1.get() << std::endl;
std::cout << v2.get() << std::endl;
std::cout << v3.get() << std::endl;
v1.set(3.14);
v2.set(42);
v3.set("Hello, C++");
std::cout << v1.get() << std::endl;
std::cout << v2.get() << std::endl;
std::cout << v3.get() << std::endl;
}
template <typename T>
const T& Value<T>::get() const {
return value;
}
//