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,所以如果它不是一个正式的标准,然后它看起来是如此非官方。