调用模板类成员时非法使用此类型作为表达式

Illegal use of this type as an expression when calling template class member

本文关键字:类型 表达式 非法 成员 调用      更新时间:2023-10-16

我在使用类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的方法可能会在这里有所帮助。

相关文章: