小编The*_*ake的帖子

模板方法中的std容器

问候.

我不太清楚如何解释自己,但我相信一段代码会让你理解我想要做的事情:

template<class A, class B>
void myFunction(A<B>& list)
{
  typename A<B>::iterator current = list.begin();
  typename A<B>::iterator end = list.end();

  while (current != end)
  {
    current++;
  }
}
Run Code Online (Sandbox Code Playgroud)

其中A是STL容器(vector,list ...).它就像开始一样,但有模板:模板,模板内等......

问题是:当你的模板的一个参数本身就是一个模板时,你会怎么做......并且仍然希望支持这个模板支持的每个类型.

这当然不能编译(它说"A不是模板").

有人知道如何创建这样的模板吗?

c++ containers templates std

6
推荐指数
2
解决办法
5286
查看次数

编译动态链接库

我目前正在尝试使用Windows和MinGW编译动态链接库(用于插件系统).

我使用此命令行编译每个对象:

mingw-g++ -fPIC test.cpp
Run Code Online (Sandbox Code Playgroud)

和使用这一行的图书馆:

mingw-g++ -rdynamic -shared -Wl,-soname,test.so.1 -o test.so test.o

它根本不起作用(使用GCC与Linux,类似的线路工作):fPIC和rdynamic由于某种原因被忽略.在尝试创建库时,它失败了,因为编译器尝试将它与应该被解析的对象链接起来,因为我将它与主二进制文件动态链接.

那你怎么用MinGW编译呢?

谢谢 :) !

windows mingw

3
推荐指数
1
解决办法
2614
查看次数

变体,递归函数和类型推断

我是OCaml的新手,但过去两天都在工作,以便更好地理解如何使用它.我最近做了很多事情但有些事情让我不能前进.

我正在尝试在OCaml中实现evalexpr.很容易使用这个语言,你会说:所以我想,我做的第一个,使用常规的int,工作得很好.但是现在我正在尝试使用我的OWN类型和我自己的函数来解决操作:当然它并不像我预期的那么容易.

type expr =
  | Number of MyInt.myint
  | Sum of (expr * expr)
  | Sub of (expr * expr)
  | Product of (expr * expr)
  | Divide of (expr * expr)
  | Modulo of (expr * expr)

let rec evalexpr expr = function
  | Number n       -> n
  | Sum (a, b)     -> MyInt.add (evalexpr a) (evalexpr b)
  | Sub (a, b)     -> MyInt.sub (evalexpr a) (evalexpr b)
  | Product (a, b) -> MyInt.mul (evalexpr a) (evalexpr b) …
Run Code Online (Sandbox Code Playgroud)

recursion ocaml type-inference variant

2
推荐指数
1
解决办法
315
查看次数

模板专业化不明确

又一个模板问题!我正在尝试获取一个模板方法,如果它有一个运算符<<的重载,它将输出一个对象.我几乎都在工作,并实现了一个enable_if,以使g ++为每种类型的对象选择预期的专业化.

事情是,对于非重载对象,它工作得很好.但是对于一个超载的,我的两个专业都是g ++的合理选择,而不是编译它输出一个模糊的重载错误.

这是代码:

template<typename T>
  static void   Print(Stream& out, T& param, typename enable_if<CanPrint<T>::value>::type = 0)
  {
    out << param;
  }

  template<typename T>
  static void   Print(Stream& out, T& param)
  {
    out << "/!\\" << typeid(param).name() << " does not have any overload for <<.\n";
  }
Run Code Online (Sandbox Code Playgroud)

我理解为什么这样的事情是模棱两可的.然而,我想不出一种方法可以让它变得更加明显......我如何让编译器明白第二次重载只有在第一次不能被选中时才会被选中?

c++ templates template-meta-programming

0
推荐指数
1
解决办法
196
查看次数