类模板方法的定义

题目描述

我们通常这样编写函数:

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;
}
//