小编qdi*_*dii的帖子

为什么模板函数不能编译?

这是一个非常简短的片段,不能用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,它说的完全一样.

c++ linker gcc templates template-function

1
推荐指数
1
解决办法
120
查看次数

我应该使用静态还是内联?

我写一个只有头库,我无法弥补,宣布我提供给用户的功能之间我的脑海里staticinline.在这种情况下,为什么我应该更喜欢一个到另一个?

c c++ static inline

1
推荐指数
1
解决办法
275
查看次数

stringbuf::flush 何时被调用?

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++ synchronization std stringbuffer

1
推荐指数
1
解决办法
436
查看次数

为什么调用容器的标准库不存在删除函数?

据说,在C++标准库中

容器可能具有提供更好性能的成员函数.

由于SFINAE允许检测是否存在这样的成员函数(例如,这里),所以编写std::erase使得它调用容器的成员函数(如果存在)不应该太复杂.为什么不这样做?

c++ algorithm stl erase c++-standard-library

1
推荐指数
1
解决办法
88
查看次数

"this"的值何时偏移了偏移量?

我想assert( this != nullptr );知道在成员函数中是否是一个好主意,并且有人指出如果this已经添加了偏移值,它将不起作用.在这种情况下,它不是0,而是40,这使得断言无用.

什么时候会发生这种情况?

c++ pointers this

0
推荐指数
1
解决办法
193
查看次数

为什么std :: map没有提供key_iterator和value_iterator?

我在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)

那为什么不提供呢?有没有办法让第一种模式适应第二种模式?

c++ iterator stdmap standard-library c++03

0
推荐指数
1
解决办法
316
查看次数