Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何强制模板化与基类匹配?_C++_Templates_Explicit Instantiation - Fatal编程技术网

C++ 如何强制模板化与基类匹配?

C++ 如何强制模板化与基类匹配?,c++,templates,explicit-instantiation,C++,Templates,Explicit Instantiation,我有一个模板函数,它是为Base类显式实例化的,但不是为派生的类显式实例化的。如何强制传递派生类(或其他派生类)的使用与基本类匹配 头文件: class Base { }; class Derived : public Base { }; class Derived2 : public Base { }; template <typename Example> void function(Example &arg); 类基{ }; 派生类:公共基{ }; 派生类2:公共基

我有一个模板函数,它是为
Base
类显式实例化的,但不是为
派生的
类显式实例化的。如何强制传递
派生类(或其他派生类)的使用与
基本类匹配

头文件:

class Base {
};
class Derived : public Base {
};
class Derived2 : public Base {
};

template <typename Example> void function(Example &arg);
类基{
};
派生类:公共基{
};
派生类2:公共基{
};
模板无效函数(示例和参数);
实施文件:

// Explicitly instantiate Base class:
template void function<Base>(Base &arg);

// Define the template function:
template <typename Example> void function(Example &arg) {
  // Do something.
}
//显式实例化基类:
模板无效函数(基本和参数);
//定义模板功能:
模板无效函数(示例和参数){
//做点什么。
}
因为我没有显式地实例化
Derived
Derived2
的函数,所以我得到了未定义的引用,但是,我想绑定到显式定义的
Base

如何强制模板解析为使用C++-03从Base派生的所有对象的基类

我可以将
派生的
类专门化为
基本的
类定义吗?

如何:

template <> void function(Derived &arg)
{
     function<Base>( arg );
}
模板无效函数(派生的&arg)
{
功能(arg);
}
编辑:您也可以通过函数重载来执行此操作,正如aschepler所建议的:

void function(Derived &arg)
{
     function<Base>( arg );
}
void函数(派生的&arg)
{
功能(arg);
}
这在概念上是一样的,尽管我同意,稍微好一点:)

怎么样:

template <> void function(Derived &arg)
{
     function<Base>( arg );
}
模板无效函数(派生的&arg)
{
功能(arg);
}
编辑:您也可以通过函数重载来执行此操作,正如aschepler所建议的:

void function(Derived &arg)
{
     function<Base>( arg );
}
void函数(派生的&arg)
{
功能(arg);
}

在概念上是一样的,尽管我同意,稍微好一点:)

与其使用模板,为什么不使用一组重载函数呢?这样编译器就知道哪个集合可用,并可以相应地进行选择。如果要共享实现,请将这些函数转发到模板。如果
function
的参数应始终为
Base&
,则
function
不应在其参数列表中使用模板参数,并且可能根本不应是模板。@Sjoerd,因为大约有20个重载,我不希望将它们放在头文件中,而是将它们作为显式实例化移动到实现中,而且,我现在只显示一次定义,而不是每次重载显示二十次。调用函数时,您始终可以将
arg
强制转换为
(Base&)派生的
。:)@亚历克斯:我不想在打电话的时候这样做,因为这对我来说太麻烦了。我想告诉头文件中的编译器这样做。与其使用模板,为什么不使用一组重载函数呢?这样编译器就知道哪个集合可用,并可以相应地进行选择。如果要共享实现,请将这些函数转发到模板。如果
function
的参数应始终为
Base&
,则
function
不应在其参数列表中使用模板参数,并且可能根本不应是模板。@Sjoerd,因为大约有20个重载,我不希望将它们放在头文件中,而是将它们作为显式实例化移动到实现中,而且,我现在只显示一次定义,而不是每次重载显示二十次。调用函数时,您始终可以将
arg
强制转换为
(Base&)派生的
。:)@亚历克斯:我不想在打电话的时候这样做,因为这对我来说太麻烦了。我想在头文件中告诉编译器这样做。宁愿函数重载也不要函数模板的显式专门化:
inlinevoid函数(派生&arg){function(arg);}
@aschepler我认为编译器会在匹配您在这里给出的重载之前匹配模板定义。当非模板函数和函数模板专用化具有相同的函数类型时,重载解析始终选择非模板。与函数模板的显式专门化相比,更喜欢函数重载:
inline void function(派生&arg){function(arg);}
@aschepler我认为编译器会在匹配您在这里给出的重载之前匹配模板定义。当非模板函数和函数模板专用化具有相同的函数类型时,重载解析总是选择非模板。