C++ 在派生类中使用基类typedef

C++ 在派生类中使用基类typedef,c++,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>:

我尝试在派生类中使用基类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;
}
模板
阶级基础{
公众:
typedef size_t size_type;
虚拟大小\类型大小()=0;
};
模板
派生类:公共基{
公众:
使用typename Base::size\u type;
虚拟大小_type size();
};
模板
typename派生::size\u type派生::size(){
返回1;
}
clang可以编译代码,而msvc不能。编译器说“大小的定义与其声明不匹配”

我修改代码:

template <typename T>
typename Base<T>::size_type Derived<T>::size() {
    return 1;
}
模板
typename基::大小\派生类型::大小(){
返回1;
}
情况正好相反

我认为
typename Base::size\u type
更有意义,因为在基类中声明的虚拟函数也使用基类typedef。但是叮当声是不允许的


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

严格来说,如果Clang(和GCC,顺便说一句)接受您的代码,而MSVC不接受,这通常不是您的代码有问题的迹象。MSVC的模板实现长期以来一直不符合要求

然而,认识到我们生活在现实世界中,必须满足于不太理想的工具,你必须摆脱使用声明。两个编译器都将接受此修改后的代码:

#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;
}
#包括
模板
阶级基础{
公众:
typedef std::size\u t size\u type;
虚拟大小\类型大小()=0;
};
模板
派生类:公共基{
公众:
虚拟typename基::大小\类型大小();
};
模板
typename基::大小\派生类型::大小(){
返回1;
}

什么编译器版本?我有VS2017,它编译代码没有问题。@BoPersson也是VS2017。我得到错误C2244。我发现
使用size\u type=typename Base::size\u type解决了模棱两可的问题。