是否可以在非文本类型上参数化 constexpr 类模板文本类型
Can a constexpr class template literal type be parameterized on a non-literal type?
>我正在使用gcc 4.9.2的ORM设计。我有一个由2名成员组成的班级:
class Staff : public Db::TableBase<Staff> {
public:
long int staffId_;
std::string nickname_;
}
(TableBase 是我用来将几个静态函数和子类声明拉入类范围的类。它没有成员或方法,只有静态函数和子类声明。
我为每个成员都有一个列对象:
static constexpr auto colTest1=Db::detail::ColumnObject<Staff,long int>
(&Staff::staffId_,"staff_id",Db::BigSerial | Db::Default,Db::Transport::TEXT);
static constexpr auto colTest2=Db::detail::ColumnObject<Staff, std::basic_string<char> >
(&Staff::nickname_,"nick_name",Db::NotNull,Db::Transport::TEXT);
第一个语句编译,第二个语句不编译:
~/git/WebSchedule2/src/common/ORM/Staff.hpp:110:152: error: ‘const Db::detail::ColumnObject<Staff, std::basic_string<char> >{&Staff::nickname_, ((const char*)"nick_name"), 1, (Db::Transport)0, -1}’ is not a constant expression
static constexpr auto colTest2=Db::detail::ColumnObject<Staff, std::basic_string<char> >(&Staff::nickname_,"nick_name",Db::NotNull,Db::Transport::TEXT);
你可能会说,第二个语句不编译的原因是,对 std::string 的类型依赖使它成为非文字。但是,我实际上并没有在 ColumnObject 的定义中使用字符串,我只使用类型信息。ColumnObject 的定义:
template<typename Derived,typename MemberType>
class ColumnObject {
public:
MemberType Derived::*memberPtr_;
char const *columnName_;
int const traits_;
Db::Transport transport_;
int columnNumber_;
constexpr ColumnObject()
: memberPtr_(nullptr), columnName_("UNITIALIZED COLUMN"), traits_(-1),
transport_(Db::Transport::TEXT), columnNumber_(-1) { }
constexpr ColumnObject(MemberType Derived::*memberPtr, char const *columnName,
int const traits, Db::Transport transport)
: memberPtr_(memberPtr), columnName_(columnName), traits_(traits),
transport_(transport), columnNumber_(-1) { }
}
任何想法如何解决这个问题?
(编辑:我在下面包括一个完整的例子。问题似乎是使用静态常量。
// g++ -Wall -Wextra -pedantic -std=c++14 -c foo.cpp
#include <string>
template<typename Derived,typename MemberType>
class ColumnObject;
template<typename Derived,typename MemberType>
class ColumnObject {
public:
MemberType Derived::*memberPtr_;
char const *columnName_;
constexpr ColumnObject()
: memberPtr_(nullptr), columnName_("UNITIALIZED COLUMN") { }
constexpr ColumnObject(MemberType Derived::*memberPtr, const char *columnName)
: memberPtr_(memberPtr), columnName_(columnName) { }
};
class Staff {
public:
long int staffId_;
std::string nickname_;
Staff(){
staffId_=0;
nickname_="";
}
Staff(long int snid, std::string nname)
: staffId_(snid), nickname_(nname)
{
};
static constexpr auto colTest1=ColumnObject<Staff,long int>(&Staff::staffId_,"staff_id");
static constexpr auto colTest2=ColumnObject<Staff, std::string >(&Staff::nickname_,"nick_name");
};
int main(int argc, char *argv[]){
constexpr auto colTest3=ColumnObject<Staff,long int>(&Staff::staffId_,"staff_id");
constexpr auto colTest4=ColumnObject<Staff, std::string >(&Staff::nickname_,"nick_name");
}
在这里工作正常,在 clang :) -> coliru.stacked-crooked.com/a/b9a3102e4849b0d0 – pepper_chico
这现在适用于 RedHat gcc 5.3.1-2。 – user2352497
相关文章:
- CRTP 单一实例不完整类型或非文本类型
- 如何从文本文件中读取数值,直到遇到字符类型?
- 如何将文本文件的特定行读取到 int 类型的数组中C++?
- 文本冒险游戏 - 如何区分一种项目类型与另一种项目类型以及如何构建项目类/子类
- 是否可以创建一个用户定义的文本,将字符串文本转换为 own 类型的数组?
- 如何使用C++将.trc文件类型转换为文本文件?
- 整数文本太大,无法用任何整数类型表示--C++
- 具有引用数据成员的结构不是文本类型吗?
- 指针类型是文本类型吗?
- FindResource 调用返回 RCDATA 类型的文本文件的 NULL
- 常量表达式中的非文本类型'compare'
- 运行时文本类型的惊人行为
- 设计具有变体字段的文本类型类,其中可以存储一个或三个对象
- QString:包括非文本类型的静态数据成员的初始化
- 结构是非文本类型
- 为模板专用化选择字符串文本类型
- 为什么将整数文本类型转换为指针值会导致非常量表达式
- 是否可以在非文本类型上参数化 constexpr 类模板文本类型
- 空作为文本类型
- 不能创建字符串文本类型