【问题标题】:Illegal use of this type as an expression when calling template class member调用模板类成员时非法使用该类型作为表达式
【发布时间】:2017-12-01 15:48:57
【问题描述】:

我在使用类SizeObj 的静态类成员size 时遇到问题,该成员用作模板类SizeTemplate 的模板参数。请参阅下面的代码 sn-p,我将其减少到最低限度。

事实上,下面的代码在 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方法是编译失败 至少调用一次。

请不要问下面代码的意义,因为我把它简化为 必要的最低限度的解释。然而,我必须承认, 由于几个原因,成员“size”的使用不是很优雅,也许 有很多更好的解决方案,但目前我别无选择 保持这种状态。

你知道这里可能出了什么问题吗?是否可以通过构建来解决 设置或类似的东西?我还没有找到合适的东西。

在下面的帖子中很容易,因为 K 类的实例可用,但对于我的问题,我不知道如何正确获取该实例:


//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());
}

非常感谢您!

唐古尔

【问题讨论】:

  • 改用K::size
  • 好的,我想我明白了。虽然比预期的要快。而不是K.size,它需要是K::size,这很清楚。事实上,这意味着以前的编译器并不那么符合 C++ 规范。
  • 谢谢宋元瑶!

标签: c++ visual-studio visual-studio-2010 templates visual-studio-2008


【解决方案1】:

与 Java 不同,在 C++ 中,您不能对类使用点运算符,您需要使用范围解析运算符(即 ::)从类范围内获取内容(例如 size 静态变量),所以将return K.size 替换为return K::size

还将方法标记为constexpr 可能会在这里有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-25
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多