为什么std :: nullptr_t在C ++中不能与std :: cout一起使用?

时间:2017-09-16 17:39:25

标签: c++ c++14 ambiguous nullptr

我了解到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?我在这里错了什么?

1 个答案:

答案 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);
}

注意:

  • 1 正如评论中所指出的,在C ++ 17中有一个过载接受std::ostream & operator<<(std::ostream &s, std::nullptr_t) { return s << "nullptr"; } ,所以如果你使用符合标准的C +,这将不再是一个问题+17实施。
  • std::nullptr_t需要endl - 资格 - 但无论如何你应该在这里使用std::。 ('\n'只是在需要刷新流时才是个好主意。)