自定义模板化运算符 <<(T x) 上的错误 C2676
Error C2676 on custom templated operator<<(T x)
我有 logger
class 封装了 2 std::ofstream
:
class logger
{
private:
std::ofstream one;
std::ofstream two;
public:
logger();
~logger();
template<typename T> logger & operator<<(T);
};
logger::logger()
{
// open streams
}
logger::logger()
{
// close streams
}
template<typename T> logger & logger::operator<<(T log)
{
this->one<<log;
this->two<<log;
return * this;
}
我用它:
int main(int argc, char * argv[])
{
debug::log << "Some strgins"; // works perfect.
debug::log << std::endl; // error C2676: binary '<<' : 'logger' does not define this operator or a conversion to a type acceptable to the predefined operator
return 0;
}
这里发生了什么?为什么T
不能变成std::ostream&(*)(std::ostream&)
?
std::endl
是一个 函数模板 。这是一个IO 操纵器。。
有一个 std::endl<char>
、std::endl<wchar_t>
和无数个其他 std::endl
,每种可能的字符类型一个。编译器不知道你可能指的是哪一个。
它与 std::basic_ostream
一起工作,因为 std::basic_ostream
重载 operator<<
以接受适合 its 字符类型的 IO 操纵器。请记住 std::basic_ostream
也是一个模板,而 std::ostream
只是 basic_ostream<char>
.
的类型定义
您可能也想为您的 class 添加一个,只是为了 char
。
logger & logger::operator<<(std::ostream& (manip)(std::ostream&)) { ... }
编译器会知道您指的是哪个 endl
:采用 char
流的那个。
我有 logger
class 封装了 2 std::ofstream
:
class logger
{
private:
std::ofstream one;
std::ofstream two;
public:
logger();
~logger();
template<typename T> logger & operator<<(T);
};
logger::logger()
{
// open streams
}
logger::logger()
{
// close streams
}
template<typename T> logger & logger::operator<<(T log)
{
this->one<<log;
this->two<<log;
return * this;
}
我用它:
int main(int argc, char * argv[])
{
debug::log << "Some strgins"; // works perfect.
debug::log << std::endl; // error C2676: binary '<<' : 'logger' does not define this operator or a conversion to a type acceptable to the predefined operator
return 0;
}
这里发生了什么?为什么T
不能变成std::ostream&(*)(std::ostream&)
?
std::endl
是一个 函数模板 。这是一个IO 操纵器。。
有一个 std::endl<char>
、std::endl<wchar_t>
和无数个其他 std::endl
,每种可能的字符类型一个。编译器不知道你可能指的是哪一个。
它与 std::basic_ostream
一起工作,因为 std::basic_ostream
重载 operator<<
以接受适合 its 字符类型的 IO 操纵器。请记住 std::basic_ostream
也是一个模板,而 std::ostream
只是 basic_ostream<char>
.
您可能也想为您的 class 添加一个,只是为了 char
。
logger & logger::operator<<(std::ostream& (manip)(std::ostream&)) { ... }
编译器会知道您指的是哪个 endl
:采用 char
流的那个。