gpt4 book ai didi

c++ - constexpr 类模板文字类型可以在非文字类型上参数化吗?

转载 作者:太空宇宙 更新时间:2023-11-04 13:41:24 25 4
gpt4 key购买 nike

我正在使用 gcc 4.9.2 进行 ORM 设计。我有 2 名成员:

class Staff : public Db::TableBase<Staff> {
public:
long int staffId_;
std::string nickname_;
}

(TableBase 是我用来将几个静态函数和子类声明拉入类范围的类。它没有成员或方法,只有静态函数和子类声明。)

我为每个成员都有一个 ColumnObject:

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 中使用。 – 用户 2352497

关于c++ - constexpr 类模板文字类型可以在非文字类型上参数化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27586832/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com