【发布时间】:2017-07-03 23:01:44
【问题描述】:
取以下代码:
#include <string>
#include <iostream>
template <class T, class U>
class readonly
{
friend U;
private:
T data;
T operator=(const T& arg) {data = arg; return data;}
T operator+=(const T& arg) {data = data + arg; return data;}
T operator-=(const T& arg) {data = data - arg; return data;}
T operator*=(const T& arg) {data = data * arg; return data;}
T operator/=(const T& arg) {data = data / arg; return data;}
public:
operator const T&() const {return data;}
};
class myClass
{
private:
typedef readonly<int, myClass> RO_int;
typedef readonly<std::string, myClass> RO_string;
public:
RO_int x;
RO_string y;
void f()
{
x = 55;
y = "Howdy";
std::cout << x << "\n\n"; // compiles fine
std::cout << y << "\n\n"; // compile error
}
};
我使用这些模板类来确保某些公共变量x 和y 在类之外是“只读”的,但可以在类本身内进行修改。除了最后一行我试图显示字符串类型的变量 y 之外,这段代码中的所有内容都可以正常编译。我不明白为什么我可以显示x 但不能显示y。如果我需要重载<< 运算符,为什么我必须为std::string 而不是int?
【问题讨论】:
-
这只是一个包含在 main.cpp 中的头文件。我在 main.cpp 中所做的只是创建一个 myClass 类型的对象,然后调用函数 f()。对不起,我应该说得更清楚。
-
int 的输出是 0,所以我不认为它使用正确的重载来显示
x。可能您需要重载<<以使其适用于任何类型。 -
对于一些简单的事情来说似乎有很多机制:
private: int x_; public: int x() const { return x_; }。 -
@PeteBecker,虽然我同意你的观点,但我只是想避免使用 () 符号,因为它会迫使我重写很多代码。我也想避免它使我访问这些变量的数百个地方更短。
标签: c++ templates operator-keyword