C++ gcc错误的解决方法:在模板中使用chrono_文本会中断字符串_文本
在GCC 4.9.2中,以下代码未能编译:C++ gcc错误的解决方法:在模板中使用chrono_文本会中断字符串_文本,c++,gcc,chrono,compiler-bug,C++,Gcc,Chrono,Compiler Bug,在GCC 4.9.2中,以下代码未能编译: #include <chrono> #include <string> using namespace std::literals::string_literals; using namespace std::literals::chrono_literals; template<typename T> struct S { S() { "hello"s; } }; in
#include <chrono>
#include <string>
using namespace std::literals::string_literals;
using namespace std::literals::chrono_literals;
template<typename T>
struct S
{
S()
{
"hello"s;
}
};
int main()
{
S<int> s;
}
如果注释掉chrono\u literals
行,则不会出现错误,对于非模板类也不会出现错误
我认为这是一个GCC4.9错误,因为相同的代码在GCC5中工作,并且叮当作响。我的问题是:是否有一种变通方法可以让我在这个编译器版本的模板中同时使用std::string文本和chrono文本 例如,我可以在一个标准标题中编辑某些内容,或者我可以在代码中全局执行某些内容
注意:这个编译器版本没有使用命名空间STD::文字::CeaOxi文字< /COD>作为C++标准的命令;这也被添加到GCC 5中。如果您不需要在同一范围内同时使用这两个,那么只需在需要的地方使用
否则,我会根据重新实现自己的字符串文本,并将它们称为不同于s
(无论如何,您都会收到警告)。。。说\u s
。当然,您也可以实现自己的功能,但这些功能似乎更为复杂
#include <string>
#include <chrono>
inline std::basic_string<char>
operator""_s(const char* __str, size_t __len)
{ return std::basic_string<char>{__str, __len}; }
template<typename T>
struct S
{
S()
{
{
using namespace std::literals::chrono_literals;
10s;
"hello"_s;
}
{
using namespace std::literals::string_literals;
"hello"s;
}
}
};
int main()
{
S<int> s;
}
#包括
#包括
内联标准::基本字符串
运算符“”\u s(常量字符*\u字符串,大小\u长度)
{return std::basic_string{{uu str,{uu len};}
模板
结构
{
S()
{
{
使用名称空间std::literals::chrono_literals;
10秒;
“你好”;
}
{
使用名称空间std::literals::string_literals;
你好;
}
}
};
int main()
{
S S;
}
您需要在顶层使用吗?您是否需要在同一个函数中同时使用这两个函数?同样的范围?
#include <string>
#include <chrono>
inline std::basic_string<char>
operator""_s(const char* __str, size_t __len)
{ return std::basic_string<char>{__str, __len}; }
template<typename T>
struct S
{
S()
{
{
using namespace std::literals::chrono_literals;
10s;
"hello"_s;
}
{
using namespace std::literals::string_literals;
"hello"s;
}
}
};
int main()
{
S<int> s;
}