我了解到std::nullptr_t
这是空指针文字的类型nullptr
。
然后我做了一个小程序:
#include <iostream>
int main()
{
std::nullptr_t n1;
std::cout<<n1<<endl;
return 0;
}
这里,nullptr_t
是数据类型,n1
是可变的,我正在尝试打印变量的值。但是,编译器会出错:
prog.cpp: In function 'int main()':
prog.cpp:6:11: error: ambiguous overload for 'operator<<' (operand types are 'std::ostream {aka std::basic_ostream<char>}' and 'std::nullptr_t')
std::cout<<n1<<endl;
为什么std::nullptr_t
不能在C ++中使用std::cout
?我在这里错了什么?
答案 0 :(得分:8)
mPostDatabase.child(postID).child("postComment").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
intCommentCount = (int) dataSnapshot.getChildrenCount();
tvWoowCount.setText(String.valueOf(intCommentCount));
}
});
具有多种不同类型指针的重载,但不是operator<<
1 。这意味着编译器无法确定要调用哪个重载,因为接受指针的任何重载同样好。 (例如,它接受std::nullptr_t
用于C风格的字符串,还接受char const *
,它将输出原始指针值。)
解决此问题的一个选择是定义自己的重载,强制使用void const *
重载:
void const *
或者让它做其他事情:
std::ostream & operator<<(std::ostream &s, std::nullptr_t) {
return s << static_cast<void *>(nullptr);
}
注意:
std::ostream & operator<<(std::ostream &s, std::nullptr_t) {
return s << "nullptr";
}
,所以如果你使用符合标准的C +,这将不再是一个问题+17实施。std::nullptr_t
需要endl
- 资格 - 但无论如何你应该在这里使用std::
。 ('\n'
只是在需要刷新流时才是个好主意。)