【问题标题】:Using base class typedef in derived class在派生类中使用基类 typedef
【发布时间】:2017-12-17 10:33:17
【问题描述】:

我尝试在派生类中使用基类 typedef 作为返回类型。

template <typename T>
class Base{
public:
    typedef size_t size_type;
    virtual size_type size() = 0;
};

template <typename T>
class Derived : public Base<T> {
public:
    using typename Base<T>::size_type;
    virtual size_type size();
};

template <typename T>
typename Derived<T>::size_type Derived<T>::size() {
    return 1;
}

clang 可以编译代码,而 msvc 不能。编译器说“大小的定义与其声明不匹配”。

我修改代码:

template <typename T>
typename Base<T>::size_type Derived<T>::size() {
    return 1;
}

情况正好相反。

我认为typename Base&lt;T&gt;::size_type 更有意义,因为在基类中声明的虚函数也使用基类 typedef。但铿锵不允许。

如果我必须使用 out-of-class 定义,如何修改代码以使其被两个编译器编译?

【问题讨论】:

  • 什么编译器版本?我有VS2017,它编译代码没有问题。
  • @BoPersson 也是 VS2017。我收到错误 C2244。

标签: c++


【解决方案1】:

严格来说,如果 Clang(和 GCC,顺便说一句)接受您的代码,而 MSVC 不接受,这通常并不表明您的代码有问题。 MSVC 的模板实现长期不合规。

但是,认识到我们生活在现实世界中并且不得不满足于不太理想的工具,您将不得不摆脱 using 声明。两个编译器都将接受此修改后的代码:

#include <cstddef>

template <typename T>
class Base{
public:
    typedef std::size_t size_type;
    virtual size_type size() = 0;
};

template <typename T>
class Derived : public Base<T> {
public:
    virtual typename Base<T>::size_type size();
};

template <typename T>
typename Base<T>::size_type Derived<T>::size() {
    return 1;
}

【讨论】:

  • 我发现using size_type = typename Base&lt;T&gt;::size_type;解决了模棱两可的问题。
猜你喜欢
  • 2016-02-02
  • 1970-01-01
  • 1970-01-01
  • 2017-07-04
  • 1970-01-01
  • 2010-12-11
  • 1970-01-01
  • 2019-07-25
  • 2018-11-09
相关资源
最近更新 更多