c++ - std::basic_string 完全特化(g++ 冲突)

标签 c++ templates stl g++ specialization

我正在尝试定义 std::basic_string< char, char_traits<char>, allocator<char> > 的完全特化这是由 <string> 定义的(在 g++ 中)标题。

问题是,如果我包含 <string>首先,g++ 将 typedef 视为 basic_string 的实例化并给我错误。如果我先进行特化,那么我就没有问题。

我应该能够在 <string> 之后定义我的特化已经包括了。我必须做什么才能做到这一点?

我的代码:

#include <bits/localefwd.h>

//#include <string> // <- uncommenting this line causes compilation to fail

namespace std {
template<>
class basic_string< char, char_traits<char>, allocator<char> >
{
public:
    int blah() { return 42; }
    size_t size() { return 0; }
    const char *c_str() { return ""; }
    void reserve(int) {}
    void clear() {}
};
}

#include <string>
#include <iostream>

int main() {
    std::cout << std::string().blah() << std::endl;
}

上面的代码工作正常。但是,如果我取消注释第一个 #include <string>行,我得到以下编译器错误:

blah.cpp:7: error: specialization of ‘std::basic_string<char, std::char_traits<char>, std::allocator<char> >’ after instantiation
blah.cpp:7: error: redefinition of ‘class std::basic_string<char, std::char_traits<char>, std::allocator<char> >’
/usr/include/c++/4.4/bits/stringfwd.h:52: error: previous definition of ‘class std::basic_string<char, std::char_traits<char>, std::allocator<char> >’
blah.cpp: In function ‘int main()’:
blah.cpp:22: error: ‘class std::string’ has no member named ‘blah’

/usr/include/c++/4.4/bits/stringfwd.h 的第 52 行:

  template<typename _CharT, typename _Traits = char_traits<_CharT>,
           typename _Alloc = allocator<_CharT> >
    class basic_string;

据我所知,这只是模板的前向声明,而不是 g++ 声称的实例化。

/usr/include/c++/4.4/bits/stringfwd.h 的第 56 行:

   typedef basic_string<char>    string;

据我所知,这只是一个 typedef,也不是实例化。

那么为什么这些行与我的代码冲突?除了确保我的代码始终包含在 <string> 之前,我还能做些什么来解决这个问题? ?

最佳答案

如果特化依赖于具有外部链接的用户定义名称,则只允许特化标准库。 char 不满足此要求,您会遇到未定义的行为。

这是在 17.4.3.1 [lib.reserver.names]/1 中指定的。

你得到的特定错误是因为你的实现已经实例化了你试图专门化的模板,如果你为任何模板提供专门化,它必须在使用你为之的参数实例化模板之前想提供专业。

14.7.3 [temp.expl.spec]/6

关于c++ - std::basic_string 完全特化(g++ 冲突),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2701974/

相关文章:

c++ - 每隔一段时间捕捉一次相机帧

c++ - 用 C++ 扩展 Job/Worker 多线程系统

c++ - 根据模板参数更改成员类型定义?

java - 未加载 Spring Boot 模板文件

c++ - 使用指针在映射中释放内存

c++ - 将依赖于对象的比较器作为模板参数传递,

c++ - 这个指针和方括号重载

c++ - 如何从 D DLL 返回 C 结构?

c++ - 有什么方法可以通过 using 声明来提高可见度吗?

c++ - 哪一个使用c++ STL容器或MFC容器?