moo*_*ose 10 c++ templates stl
我正在尝试将STL容器作为模板参数传递.在这种情况下,矢量.
这是我的无功能代码:
template<template<class> class TContainer, class TObject>
class Foobar
{
public:
explicit Foobar( TContainer<TObject*> & container )
:
container_( container ){}
private:
TContainer<TObject*> & container_;
};
int _tmain(int argc, _TCHAR* argv[])
{
std::vector<IUnknown*> v;
Foobar<std::vector, IUnknown*> bla( v );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是,我正在尝试做什么,因为编译器不能吞下这个?
Jes*_*ood 17
您的代码有几个问题,这是一个工作示例:
template<template<class, class> class TContainer, class TObject>
class Foobar
{
public:
explicit Foobar( TContainer<TObject*, std::allocator<TObject*>> & container )
:
container_( container ){}
private:
TContainer<TObject*, std::allocator<TObject*>> & container_;
};
int main()
{
std::vector<IUnknown*> v;
Foobar<std::vector, IUnknown> bla( v );
}
Run Code Online (Sandbox Code Playgroud)
你的代码的主要错误是它std::vector
需要两个模板参数.看起来像这样template<class T, class Allocator = std::allocator<T>> class vector;
.此外,Joachim Pileborg关于双指针问题是正确的IUnknown**
.但是,您可以使用以下代码简化代码:
template<class TContainer>
class Foobar
{
public:
explicit Foobar( TContainer & container )
:
container_( container ){}
private:
TContainer & container_; // Be careful with reference members
};
int main()
{
std::vector<IUnknown*> v;
Foobar<std::vector<IUnknown*>> bla( v ); // C++11 decltype(v) could be used
}
Run Code Online (Sandbox Code Playgroud)
Pet*_*ker 10
有三种不同的模板参数:值,类型和模板:
template <int value_argument> class C { };
template <class type_argument> class D { };
template <template<classT> class template_argument> class E { };
Run Code Online (Sandbox Code Playgroud)
使用这些模板时,您必须提供正确类型的参数:
C<3> c;
D<int> d;
E<C> e;
Run Code Online (Sandbox Code Playgroud)
使用第三种形式(模板模板参数)时,作为参数传递的模板必须与模板模板参数的声明匹配.在我的简单示例中,模板E
需要一个带有一个类型参数的模板模板参数.
在问题的代码中,声明中的第一个参数Foobar
是template <class> class TContainer
.在使用它的地方,传递的模板是std::vector
:
Foobar<std::vector, IUnknown*> bla(v);
Run Code Online (Sandbox Code Playgroud)
问题是模板模板参数表明它应该有一个参数,但作为实际参数传递的模板有两个或更多.正式,std::vector
是
template <class T, class Allocator = std::allocator<T>> class vector { ... };
Run Code Online (Sandbox Code Playgroud)
为了使用std::vector> as the first argument to
Foobar , the definition of
Foobar`需要更改,以便第一个参数采用两个类型参数:
template <template<class, class> TContainer, class TObject> class Foobar { ... };
Run Code Online (Sandbox Code Playgroud)
cat*_*dle 10
另一种可能性是制作TContainer
一个可变参数模板:
#include <vector>
struct TObject {};
struct IUnknown {};
template<template<class...> class TContainer, class TObject>
class Foobar
{
public:
explicit Foobar( TContainer<TObject*> & container ) : container_( container ){}
private:
TContainer<TObject*> & container_;
};
int main() {
std::vector<IUnknown*> v;
Foobar<std::vector, IUnknown> bla( v );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
13418 次 |
最近记录: |