std :: string:非法使用此类型作为表达式

时间:2014-05-24 18:09:46

标签: c++

#include <functional>
#include <string>
enum MaybeType{
  Nothing,
  Just
};

template<typename T>
class Maybe{
  virtual MaybeType getType() const = 0;
};

template<typename T>
class Just : public Maybe<T>{
  T value;
  virtual MaybeType getType() const{
    return MaybeType::Just;
  }
public:
  Just(T v) : value(v){}
};

template<typename T>
class Nothing : public Maybe<T>{
  virtual MaybeType getType() const{
    return MaybeType::Nothing;
  }
};

int main(){
  using namespace std;
  string s = "Hello";
  auto m = Just<string>(s); // error
}

我收到以下错误&#39; std :: string&#39; error C2275: 'std::string' : illegal use of this type as an expression

为什么我会收到此错误,在这种情况下它意味着什么?

1 个答案:

答案 0 :(得分:2)

问题是您的代码为NothingJust提供了两种含义:

  • 枚举中的值,
  • 模板类型

编译器似乎更喜欢前者;你想要晚一点。

为了解决这个问题,你可以做以下三件事之一:

  • 重命名enum值,
  • 重命名模板类,或
  • 确保两个冲突名称属于不同的名称空间。

Demo on ideone with the renamed enum constants.

Demo on ideone with a separate namespace for the enum.