c++ - 在派生类中使用基类 typedef

标签 c++

我尝试在派生类中使用基类 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<T>::size_type更有意义,因为在基类中声明的虚函数也使用基类 typedef。但是 clang 不允许。

如果我必须使用类外 定义,我该如何修改代码以使其被两个编译器编译?

最佳答案

严格来说,如果 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;
}

关于c++ - 在派生类中使用基类 typedef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47854221/

相关文章:

c++ - LRU缓存和快速定位对象常用哪些数据结构?

c++ - 虚拟构造函数问题

c++ - 项目没有添加到 vector C++

c++ - 如何获得Edge窗口句柄(HWND)?

c++ - 使用 epoll 的套接字服务器在断开连接时给出未知字节

c++ - 你能做一个 C++ 泛型函数吗?

c++ - 使用 gdb 在 Eclipse 中调试简单 C++ 时出现 "No source available for main()"错误

c++在if block 中为函数范围定义变量

c++ - 初始化结构中的常量数组

c++ - sscanf 输入不工作