首页 > 解决方案 > 在类定义中推导内联静态成员函数的返回类型

问题描述

我试图在内联函数定义之后创建返回类型的别名以存储成员变量。我在下面简化了我的情况(我想要别名的真实类型比向量更难看,真实的功能比单线更复杂。)

#include <vector>
using namespace std;
struct Test {
    template <typename T>
    static auto GetVector() { return vector<T>(); }

    using VecInt = decltype(GetVector<int>());
    VecInt x;
};

但是,clang在线上给了我以下错误using VecInt

错误:在定义之前不能使用具有推导返回类型的函数“GetVector”。

gcc 也给了我类似的错误。奇怪的是,这可以编译,尽管在我的情况下它没有用:

#include <vector>
using namespace std;
struct Test {
    template <typename T>
    static auto GetVector() { return vector<T>(); }

    void dummy() {
        using VecInt = decltype(GetVector<int>());
        VecInt x;
    }
};

有没有办法让我在内联定义之后起别名?或者,我可以将 GetVector() 函数移到结构顶部,代码将编译。但是,我想将它包含在那里。

标签: c++c++17return-type-deduction

解决方案


有没有注意到如何从其他成员函数内部调用内联定义的成员函数,即使被调用者在类中比调用者更远?起作用的原因是因为编译器采用成员函数的内联定义并将定义移动到类的底部,就在该}部分之后。所以你实际上有一个隐式的前向声明。

对于声明等类型别名,情况并非如此using。这些声明准确地存在于它们在类中的位置;他们不能引用类后面的声明或定义。

由于您的函数的返回值不能仅通过声明来推断,并且实际定义(推断返回值所需的东西)存在于类的末尾,因此您的using别名无法编译。除了直接声明函数的返回值之外,您对此无能为力。或者将类型别名声明为具有所需类型,然后让函数使用该别名。


推荐阅读