模板类成员函数的前向声明

时间:2019-04-24 06:20:03

标签: c++ templates forward-declaration

这是Mappings类的前向声明:

template<typename Type, typename IDType=typename Type::IDType>
class Mappings;

template<typename Type, typename IDType>
class Mappings
{
public:
    ...
    Type valueFor(const IDType& id);
    ...
};

如何转发声明valueFor函数?

我需要类似的东西

template<typename Type, typename IDType>
Type Mappings::valueFor(const IDType& id)
{
    // return value 
}

1 个答案:

答案 0 :(得分:3)

正如上面的注释中已经指出的那样,不可能只声明一个类的单个成员函数。如果您实际上正在寻找的是一种在类之外定义成员函数的方法:

template <typename Type, typename IDType = typename Type::IDType>
class Mappings;

template <typename Type, typename IDType>
class Mappings
{
public:
    Type valueFor(const IDType& id);
};

template <typename Type, typename IDType>
Type Mappings<Type, IDType>::valueFor(const IDType& id)
{
    return {};
}

live example here

请注意,::之前的类名称需要包含模板参数。在类定义之外的成员函数的定义中,名称必须由类名称[class.mfct]/4限定,后跟::Mappings是类模板的名称,而不是类的名称。虽然在类模板的定义内,可以将模板的名称与类[temp.local]/1的名称同义使用,但在此成员函数的定义处,我们不在任何模板的定义内介绍。因此,您需要在此处使用该类的适当名称。