【发布时间】:2013-04-11 09:44:54
【问题描述】:
我在 C++11 中使用以下代码并收到一个错误,我不允许使用 typeof!
有什么问题以及如何解决这个问题?
错误:
Error 10 error C2923: 'typeof' is not a valid template type argument for parameter 'C'
这是我的代码:
#define HIBERLITE_NVP(Field) hiberlite::sql_nvp< typeof(Field) >(#Field,Field)
class Person{
friend class hiberlite::access;
template<class Archive>
void hibernate(Archive & ar)
{
ar & HIBERLITE_NVP(name); //ERROR
ar & HIBERLITE_NVP(age); //ERROR
ar & HIBERLITE_NVP(bio); //ERROR
}
public:
string name;
double age;
vector<string> bio;
};
sql_nvp 是这样的:
template<class C>
class sql_nvp{
public:
std::string name;
C& value;
std::string search_key;
sql_nvp(std::string _name, C& _value, std::string search="") : name(_name), value(_value), search_key(search) {}
};
【问题讨论】:
-
“C++ 没有
typeof”怎么样? -
改用
decltype。 -
另外,您可以编写一个可以推断类型的函数模板,例如
make_nvp(#Field,Field)。这也适用于没有decltype的旧版本语言。 -
同意@MikeSeymour。澄清一下:类模板没有模板参数推导,这就是为什么标准有一个
std::make_pair<T,U>(T, U)来创建一个std::pair<T,U>。显然,make_nvp<Field>将是一个模板函数,它返回一个sql_nvp<Field>,使用模板参数推导找出Field类型。 -
为了保护 OP,许多编译器的 typeof 带有可变语义,有些带有下划线等。因此使用 decltype 重新开始。加上Javascript,C#这样拼写。
标签: c++ visual-c++ c++11