相关疑难解决方法(0)

为什么模板只能在头文件中实现?

引自C++标准库:教程和手册:

目前使用模板的唯一可移植方法是使用内联函数在头文件中实现它们.

为什么是这样?

(澄清:头文件不是唯一的便携式解决方案.但它们是最方便的便携式解决方案.)

c++ templates c++-faq

1660
推荐指数
14
解决办法
46万
查看次数

如何显式实例化模板函数?

我有一个带有一个参数的模板函数.我必须实例化该函数而不调用该函数意味着我必须实例化.

我有这个功能:

template <class T> int function_name(T a) {}
Run Code Online (Sandbox Code Playgroud)

我实例化了这样的函数:

template int function_name<int>(int);
Run Code Online (Sandbox Code Playgroud)

但是我遇到了以下错误:

error: expected primary-expression before 'template'
error: expected `;' before 'template'
Run Code Online (Sandbox Code Playgroud)

c++ templates

110
推荐指数
3
解决办法
7万
查看次数

Lambda表达式作为类模板参数

可以lambda表达式被用来作为类模板参数?(注意这是比一个非常不同的问题这一个,其中询问是否lambda表达式本身可以模板化).

我问你是否可以这样做:

template <class Functor> 
struct Foo { };
// ...
Foo<decltype([]()->void { })> foo;
Run Code Online (Sandbox Code Playgroud)

这在例如类模板具有各种参数之类的情况下是有用的,这些参数equal_to通常被实现为单行仿函数.例如,假设我想实例化一个使用我自己的自定义相等比较函数的哈希表.我希望能够说出类似的话:

typedef std::unordered_map<
  std::string,
  std::string,
  std::hash<std::string>,
  decltype([](const std::string& s1, const std::string& s2)->bool 
    { /* Custom implementation of equal_to */ })
  > map_type;
Run Code Online (Sandbox Code Playgroud)

但我在GCC 4.4和4.6上对此进行了测试,但它不起作用,显然是因为lambda表达式创建的匿名类型没有默认构造函数.(我记得有一个类似的问题boost::bind.)是否有某些原因标准草案不允许这样做,或者我错了并且允许但是GCC仅仅落后于它们的实施?

c++ lambda templates c++11

60
推荐指数
4
解决办法
3万
查看次数

标签 统计

c++ ×3

templates ×3

c++-faq ×1

c++11 ×1

lambda ×1