如何访问相同特征C ++的不同特征专业化?

问题描述 投票:0回答:1

我正面临这个让我疯狂的问题。我有一个模板化的结构,能够提供部分专业化:

template <typename ReturnType>
struct field {
  template <typename MessateType>
  inline static ReturnType get(MessateType const& message, int const field) {
    static_assert(false, "Missing trait specialization for the given type");
  }
};

现在。如果我尝试使用非支持类型,我希望这个通用的通知我。到现在为止还挺好。

有了这个,我需要专门为int:

template <>
struct field<int> {
  template <typename MessateType>
  inline static int get(MessateType const& message, int const field) {
    return std::atoi(message.getField(field).c_str());
  }
};

而现在,除了为了简洁起见我正在削减的其他类型之外,我需要专注于提升:选项。为此,我正在尝试以下代码:

template <typename T>
struct field<optional<T>> {
  template <typename MessateType>
  inline static optional<T> get(MessateType const& message, int const field) {
    return message.isSetField(field) ? field<T>::get(message, field)
                                     : optional<T>(boost::none);
  }
};

但是,我在编译器上收到以下错误:

error C2275: 'T': illegal use of this type as an expression
error C2039: 'get': is not a member of '`global namespace''

我一直在寻找解决方案,但我找不到它。看起来编译器不喜欢我试图从另一个特征(int)访问其中一个特征(optional<int>)的事实。

c++ c++11 compiler-errors traits typetraits
1个回答
0
投票

T.C.的评论“重命名你的第二个函数参数。”是解决方案:

我改成了:

template <typename T>
struct field<optional<T>> {
  template <typename MessateType>
  inline static optional<T> get(MessateType const& message, int const field_id) {
    return message.isSetField(field_id) ? field<T>::get(message, field_id)
                                        : optional<T>(boost::none);
  }
};

它完美地运作。非常感谢!

© www.soinside.com 2019 - 2024. All rights reserved.