这是一个非常简短的片段,不能用g ++ 4.7.1编译(顺便说一下,它不能用gcc 4.6.3编译).
#include <iostream>
template<typename T>
struct Foo
{
template<typename U>
friend std::ostream& operator<<(Foo&, U&);
};
template<typename T, typename U>
std::ostream& operator<<(Foo<T> foo, U& u)
{
std::cout << u;
return std::cout;
}
int main()
{
Foo<int> f;
f << "bar";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这就是gcc 4.7.1输出(4.6.3几乎相同的东西).
/tmp/ccNWJW6X.o:在函数
main': main.cpp:(.text+0x15): undefined reference tostd :: basic_ostream>&operator <<(Foo&,char const(&)[4])'collect2:ld返回1退出状态
有谁能解释为什么?
编辑
我也尝试过clang 3.1,它说的完全一样.
我写一个只有头库,我无法弥补,宣布我提供给用户的功能之间我的脑海里static或inline.在这种情况下,为什么我应该更喜欢一个到另一个?
struct encrypt_stream : public std::stringbuf
{
int sync() { encrypt_buffer(); flush_to_device(); }
...
private:
void encrypt_buffer();
void flush_to_device();
};
Run Code Online (Sandbox Code Playgroud)
我想编写这个类来加密文本数据。每次stringbuf刷新该对象时,sync都会调用该对象并将缓冲区的加密版本发送到设备。flush加密文本很大程度上取决于调用的时刻。是否存在flush不需要用户请求就可以调用该对象的棘手情况?
我知道收到flush后会被调用std::endl,但是还有其他我不知道的情况吗?
据说,在C++标准库中
容器可能具有提供更好性能的成员函数.
由于SFINAE允许检测是否存在这样的成员函数(例如,这里),所以编写std::erase使得它调用容器的成员函数(如果存在)不应该太复杂.为什么不这样做?
我想assert( this != nullptr );知道在成员函数中是否是一个好主意,并且有人指出如果this已经添加了偏移值,它将不起作用.在这种情况下,它不是0,而是40,这使得断言无用.
什么时候会发生这种情况?
我在C++ 03环境中工作,并将一个函数应用于地图的每个键是很多代码:
const std::map<X,Y>::const_iterator end = m_map.end();
for (std::map<X,Y>::const_iterator element = m_map.begin(); element != end; ++element)
{
func( element->first );
}
Run Code Online (Sandbox Code Playgroud)
如果key_iterator存在,相同的代码可以利用std::for_each:
std::for_each( m_map.key_begin(), m_map.key_end(), &func );
Run Code Online (Sandbox Code Playgroud)
那为什么不提供呢?有没有办法让第一种模式适应第二种模式?