【问题标题】:template expressions and visual studio 2005 c++模板表达式和Visual Studio 2005 C++
【发布时间】:2010-05-11 13:12:12
【问题描述】:

我想用我的 Visual Studio 2005 编译器构建 olb3d 库,但由于模板错误而失败。

更具体地说,以下表达式似乎有问题:

void function(T u[Lattice<T>::d])

在该项目的网站上说,大概我的编译器无法处理如此复杂的模板表达式 - 应该使用 gcc 3.4.1。

我现在的问题是,是否有办法升级我的 vs c++ 编译器,以便它可以处理 gcc 3.4.1 级别的模板表达式?如果我获得更新版本的 Visual Studio 可能会有所帮助?

干杯 C.

【问题讨论】:

  • 你能多贴一点代码吗?也许一个完整的 sn-p 应该编译但没有?
  • Lattice&lt;T&gt;::d 部分似乎完全没有必要,因为数组衰减为指针,[] 之间的值被忽略。 (也许你没有发布一个真实的例子。)
  • 发布更有意义的问题描述。从您到目前为止发布的内容来看,没有理由相信 任何 编译器都能够处理您的代码(实际上恰恰相反)。
  • @AndreyT:GCC 和 Comeau 似乎对它做得很好。也许它算作不可演绎的上下文,VC++也是对的?
  • @UncleBens 明确允许不可推导的上下文包含非推导参数和推导参数(标准以函数类型为例,但数组类型同样适用)。所以这个例子应该仍然可以编译。事实上,在演绎完成之前,T u[...] 已转换为 T*,因此在演绎过程中甚至不会出现未演绎的上下文:)

标签: c++ visual-c++ templates visual-c++-2005


【解决方案1】:

购买更新版本的 Visual Studio。 2005 已经很老了,而且不太符合标准。你可以先下载Visual C++ Express来测试新的。

【讨论】:

  • 我试过VS 2010但是编译器错误仍然存​​在...... olb3d的模板代码似乎很奇怪......
【解决方案2】:

编译器说它不能推断出模板类型。您总是可以通过在代码中指定类型本身来帮助它。

foo<int>(some_int_array);

但是,[] 之间的部分是完全没有意义的。数组衰减为指针,并且值首先被忽略。如果这是一个真实的例子,你可以把那部分注释掉。

如果你通过引用来获取数组,VC++2005 似乎也没有任何问题:

template <class T>
void function(T (&arr)[Lattice<T>::n]);

(有没有可能无法编译的案例是如此毫无意义,以至于没有人费心去检查这样的事情是否有效?)

【讨论】:

  • 你是绝对正确的。他们应该只写 func(T* u) 并且它会工作......但是 olb3d 的源代码充满了这些奇怪的模板语句......我想我会放弃尝试在 windows 环境中编译它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-02
  • 2010-09-22
相关资源
最近更新 更多