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

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

我在使用 class SizeObj 的静态 class 成员 size 时遇到问题,它用作模板 [=] 的模板参数43=]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方法是编译失败 至少调用一次。

请不要问下面代码的意义,正如我说的那样,我将它简化为 必要的最低解释。然而,我必须承认 由于多种原因,成员 'size' 的用法不是很优雅,也许 有很多更好的解决方案,但目前,我别无选择 保持这样。

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

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


//myTemplate.h</p>

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++ 中,您不能在 classes 上使用点运算符,您需要使用范围解析运算符(即 ::)从 class 范围(例如 size 静态变量),因此将 return K.size 替换为 return K::size

同时将方法标记为 constexpr 可能会有所帮助。