【发布时间】: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 类的实例可用,但对于我的问题,我不知道如何正确获取该实例:
- Illegal use of type in template
- Simple templated function to convert std::vectors - "illegal use of this type as an expression"
//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