我有一个基类类似于下面的代码.我试图重载<<以与cout一起使用.但是,g ++说:
base.h:24: warning: friend declaration ‘std::ostream& operator<<(std::ostream&, Base<T>*)’ declares a non-template function
base.h:24: warning: (if this is not what you intended, make sure the function template has already been declared and add <> after the function name here) -Wno-non-template-friend disables this warning
Run Code Online (Sandbox Code Playgroud)
我尝试在类声明/原型中添加<<之后的<>.但是,我明白了does not match any template declaration.我一直试图让操作符定义完全模板化(我想要的),但我只能使用以下代码使用操作符手动实例化.
base.h
template <typename T>
class Base {
public:
friend ostream& operator << (ostream &out, Base<T> *e);
};
Run Code Online (Sandbox Code Playgroud)
base.cpp
ostream& operator<< (ostream &out, Base<int> *e) {
out << e->data;
return …Run Code Online (Sandbox Code Playgroud) 5.7美元 -
"[..]另外,两个操作数都应具有算术或枚举类型,或者一个操作数应是指向完全定义的对象类型的指针,另一个操作数应具有整数或枚举类型.
2对于减法,以下之一应保持: - 两个操作数都具有算术或枚举类型; 或者 - 两个操作数都是指向同一个完全定义的对象类型的cv-qualified或cv-nonqualified版本的指针; 或 - 左操作数是指向完全定义的对象类型的指针,右操作数具有整数或枚举类型.
int main(){
int buf[10];
int *p1 = &buf[0];
int *p2 = 0;
p1 + p2; // Error
p1 - p2; // OK
}
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是为什么在C++中不支持'指针添加'但是'指针减法'是?
很抱歉再次打开这个话题,但是考虑这个话题本身已经开始给我一个未定义的行为.想要进入定义明确的行为区域.
特定
int i = 0;
int v[10];
i = ++i; //Expr1
i = i++; //Expr2
++ ++i; //Expr3
i = v[i++]; //Expr4
Run Code Online (Sandbox Code Playgroud)
我认为上面的表达式(按此顺序)为
operator=(i, operator++(i)) ; //Expr1 equivalent
operator=(i, operator++(i, 0)) ; //Expr2 equivalent
operator++(operator++(i)) ; //Expr3 equivalent
operator=(i, operator[](operator++(i, 0)); //Expr4 equivalent
Run Code Online (Sandbox Code Playgroud)
现在来到这里的行为是来自C++ 0x的重要引用.
$ 1.9/12-"表达式(或子表达式)的评估通常包括值计算(包括确定用于左值评估的对象的身份以及获取先前分配给对象以进行右值评估的值)和启动副作用".
$ 1.9/15-"如果标量对象的副作用相对于同一标量对象的另一个副作用或使用相同标量对象的值计算的值没有排序,则行为未定义."
[注意:与不同参数表达式相关的值计算和副作用未被排序. - 尾注]
$ 3.9/9-"算术类型(3.9.1),枚举类型,指针类型,指向成员类型的指针(3.9.2),std :: nullptr_t和这些类型的cv限定版本(3.9.3)统称为标量类型."
在Expr1中,对表达式i(第一个参数)的评估在对评估operator++(i)(具有副作用)方面没有考虑.
因此,Expr1具有未定义的行为.
在Expr2中,对表达式i(第一个参数)的评估在对评估operator++(i, 0)(具有副作用)的评估方面没有考虑.
因此,Expr2具有未定义的行为.
在Expr3中,在调用operator++(i)外部之前,必须完成对单个参数的评估operator++.
因此,Expr3具有良好定义的行为. …
可能重复:
为什么C没有无符号浮点数?
问题可能是非常基本的,可能很早就回答了,但我想了解为什么C++没有无符号浮点类型,即使浮点文字可以是有符号或无符号的.
$ 3.9.1/8-"有三种浮点类型:float,double和long double."
我在接受采访时被问到这一点,显然这是一个简单的问题,但对我而言并不是,现在仍然不明显.
给定一个字符串,计算其中的所有单词.如果重复它们无关紧要.只是文本文件中的总计数字数.单词是由空格分隔的任何东西,标点符号无关紧要,只要它是单词的一部分.
例如:
A very, very, very, very, very big dog ate my homework!!!! ==> 11 words
我的"算法"只是查找空格并递增计数器直到我达到空值.既然我没有得到这份工作,之后被要求离开,我想我的解决方案并不好?谁有更聪明的解决方案?我错过了什么吗?
在C++中,将函数或变量放在匿名命名空间中会使其内部链接,即与static在文件级别上声明它相同,但却是惯用的C++.
普通命名空间中的匿名命名空间怎么样?它仍然保证内部联系吗?
// foo.cpp
void func1() {
// external linkage
}
static void func2() {
// internal linkage
}
namespace {
void func3() {
// internal linkage
}
}
namespace ns1 {
void func4() {
// external linkage
}
namespace {
void func3() {
// still internal linkage?
}
}
}
Run Code Online (Sandbox Code Playgroud) 当标准陈述时,它究竟意味着什么
$ 7.3.1.1/2 - "在命名空间作用域中声明变量时,不推荐使用static关键字(参见附录D); unnamed-namespace提供了一个更好的选择."
我已经提到了这个,但它没有涵盖我正在寻找的东西.
有没有一个例子可以清楚地证明其优越性.
注意:我知道未命名的命名空间如何在翻译单元中显示外部变量,并将其隐藏在其他翻译单元中.但这篇文章的重点是'静态命名空间范围'名称(例如全局静态变量)
$ 12.8/2 - '类X的非模板构造函数是一个复制构造函数,如果它的第一个参数是类型X&,const X&,volatile X&或const volatile X&,并且没有其他参数或者所有其他参数都有默认值参数(8.3.6).106)'
到目前为止,我还没有遇到任何需要使用其他默认参数声明复制构造函数的情况的示例.
想知道任何实时使用这种带有多个参数的复制构造函数.