如何转发声明一个C++模板类?

Tro*_*mas 81 c++ templates forward-declaration

给出如下的模板类:

template<typename Type, typename IDType=typename Type::IDType>
class Mappings
{
public:
    ...
    Type valueFor(const IDType& id) { // return value }
    ...
};
Run Code Online (Sandbox Code Playgroud)

有人如何在头文件中声明此类?

Pub*_*bby 89

这是你怎么做的:

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

template<typename Type, typename IDType>
class Mappings
{
public:
    ...
    Type valueFor(const IDType& id) { // return value }
    ...
};
Run Code Online (Sandbox Code Playgroud)

请注意,默认值位于前向声明中,而不是实际定义中.


Ell*_*ith 10

可以声明一个模板化的类,其定义声明了默认参数,但任何时候引用该类时,您都必须包含它的所有参数,直到引入定义为止。

例如。让我们在std::vector不包含它的情况下使用(std::vector使用默认值定义的第二个参数):

namespace std
{
    template<typename, typename>
    class vector;
}

#include <iostream>

template <typename S, typename T>
void Foo (const std::vector<S,T> & vector)
{
    std::cout << "do vector stuff, eg., display size = "
        << vector.size() << std::endl;
}

template <typename T>
void Foo (const T & t)
{
    std::cout << "do non-vector stuff..." << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

然后我们可以在包含向量的情况下使用它,例如:

int main ()
{
    Foo(3);
}
Run Code Online (Sandbox Code Playgroud)

...或者我们可以将它与 一起使用 std::vector,例如:

#include <vector>

// Now the compiler understands how to handle
// std::vector with one argument
// (making use of its default argument)

int main ()
{
    Foo(std::vector<int>(3));
}
Run Code Online (Sandbox Code Playgroud)

我没有检查的标准,但在这个作品clang/gcc-std=c++98高达-std=c++17,所以如果它不是一个正式的标准,然后它看起来是如此非官方。


Die*_*ühl 8

您只能为模板的第一个声明声明模板的默认参数.如果您希望允许用户转发声明类模板,则应提供转发标头.如果你想使用默认值转发声明别人的类模板,那你就不走运了!