我的编译器不允许使用以下定义,因为它std::string有一个非平凡的析构函数(teststr理所当然,当成员没有时,它不能有一个简单的dtor):
class teststr
{
private:
std::string _m;
public:
constexpr teststr(std::string value) : _m(value) {};
constexpr std::string m() const { return _m; }
void m(std::string value) { _m = value; }
};
Run Code Online (Sandbox Code Playgroud)
但是,teststr允许以下等效(据我所知)定义:
template<typename T>
class test
{
private:
T _m;
public:
constexpr test(T value) : _m(value) {};
constexpr T m() const { return _m; }
void m(T value) { _m = value; }
};
typedef test<std::string> teststr;
Run Code Online (Sandbox Code Playgroud)
模板允许这个定义的类型是什么?
解释这一点的最佳方式是演示.
有一组数字.它们可能会重复,因此:
1110,0100,0100,0010,0110 ......
我正在寻找的数字是有点设置的数字,不会出现在任何其他数字中.结果是数字(在这种情况下为1 - 第一个数字)和位位置(或掩码很好)所以1000(第4位).可能有多个解决方案,但为此目的,它可能是贪婪的.
我可以通过迭代来做...对于每个数字N,它是:
N&〜(其他数字也在一起)
但是比特的本质是,如果你在盒子外思考,总有一种更好的方法.例如,出现多次的数字永远不会有唯一的位,并且对ORing没有影响.
假设我上课了Foo.以下工作正常:
class Foo
{
public:
const int* bar;
Foo()
{
bar = new int[2] {1, 2};
}
};
Run Code Online (Sandbox Code Playgroud)
但是,我尝试稍微改变一下以使用模板:
template<int A, int B>
class Foo
{
public:
const int* bar;
Foo()
{
bar = new int[2] {A, B};
}
};
Run Code Online (Sandbox Code Playgroud)
我的方法模板工作的理解是,A和B基本上编译时间常数,所以它应该仍然工作一样.
我用g ++编译时得到的错误信息(链接中为4.5,与4.6.3相同的错误)是:
错误:ISO C++禁止在数组中初始化[-fpermissive]
使用4.7时会出现类似的错误,但略有不同:
错误:数组中的括号初始值设定项[-fpermissive]
问题也发生在模板函数中,而不仅仅是在大括号内使用模板参数进行初始化,代码和输出时.(感谢Philipp)
我用ragel和C作为主语.
我只能使用'\n'来识别换行符,但我需要识别文件的开头作为替代.
在正则表达式的其他实现中,这可以由\A或给出$,但是$为了其他目的而保留,'\A'映射到其他东西(警报?)并\A给出解析器错误.