调用模板类成员时非法使用此类型作为表达式
Illegal use of this type as an expression when calling template class member
我在使用类SizeObj
的静态类成员size
时遇到问题,该类成员用作模板类SizeTemplate
的模板参数。请参阅下面的代码片段,我将其减少到最低限度。
实际上,下面的代码在MS VS2008之前运行良好,但是现在编译失败了 使用 VS2010 编译时。将显示以下错误消息:
error C2275: 'K' : illegal use of this type as an expression
error C2228: left of '.size' must have class/struct/union
需要说明的是,只有当getSize
方法为 至少叫过一次。
请不要问下面代码的意义,如前所述,我将其简化为 基本最低解释。但是,我需要承认 由于多种原因,成员"大小"的使用不是很优雅,也许 有很多更好的解决方案,但目前,我别无选择 保持这样。
你知道这里可能出了什么问题吗?是否有可能通过构建来解决这个问题 设置或类似的东西?我还没有找到合适的东西。
在下面的帖子中,这很容易,因为 K 类的实例可用,但对于我的问题,我不知道如何正确获取该实例:
- 在模板中非法使用类型
- 用于转换 std::vectors 的简单模板化函数 - "非法使用此类型作为表达式">
//myTemplate.h
class SizeObj
{
public:
static const int size = 1;
};
template<class K>
class SizeTemplate
{
public:
int getSize();
};
template<class K>
int SizeTemplate<K>::getSize()
{
return K.size;
}
//main.cpp
int main(...)
{
SizeTemplate<SizeObj> sizeObj;
printf("size:%d", sizeObj.getSize());
}
提前非常感谢!
坦目标
与 Java 不同,C++你不能在类上使用点运算符,你需要使用范围解析运算符(即::
) 从类范围内获取内容(例如size
静态变量),因此将return K.size
替换为return K::size
另外,标记要constexpr
的方法可能会在这里有所帮助。
相关文章:
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 如何计算具有指定类型的表达式的相对精度和绝对精度
- 来自 DLL 的函数调用 [表观调用的括号前面的表达式必须具有(指向-)函数类型]
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- 有没有办法一次声明相同类型的多个对象,并通过一个表达式立即使用相同的右值初始化它们?
- 表观调用前面的表达式必须具有指向 func 类型的指针
- 数组类型 int[n][n] 不可赋值,因为表达式必须具有常量值
- 正则表达式以匹配数字的重复模式,后跟任何类型的分隔符?
- C++ 编译错误:意外的类型名称"字符串":预期的表达式
- 表达式必须具有类类型 vs.
- 错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型
- 非类类型表达式的静态类型与动态类型之间的差异
- 如何确定涉及 C++ 中除法的算术表达式的数据类型
- 结构化绑定初始值设定项表单 { 赋值表达式 } 对于 clang 上的数组类型失败
- 下标需要数组或指针类型表达式必须具有指针对象类型
- 带有数组类型表达式的错误分配
- 表示函数参数的元组的类型表达式
- 如何确定撤销类型表达式的更大类型
- c++ 11中有新的函数类型表达式格式吗?