我有这样的代码,效果很好:
#include <algorithm>
#include <iostream>
char x[11]= "ABCDEFGHIJ";
char y[11];
struct F {
char operator () (char c) const
{ return c+1; }
};
int main()
{
std::transform(x, x+10, y, F());
y[10] = 0; std::cout <<y <<std::endl;
}
但如果我把它改成这种风格:
#include <algorithm>
#include <iostream>
char x[11]= "ABCDEFGHIJ";
char y[11];
int main()
{
struct F {
char operator () (char c) const
{ return c+1; }
};
std::transform(x, x+10, y, F());
y[10] = 0; std::cout <<y <<std::endl;
}
它不会编译,说:
错误:没有匹配函数来调用'transform(char [11],char *,char [11],main():: F)'
怎么了?
gcc版本是4.4,它不识别lambda表达式。
在C ++ - 98/03中,第二个代码无效,因为F是本地类型;事实上,在§14.3.1.2中说明了这一点
本地类型,没有链接的类型,未命名的类型或从这些类型中的任何类型复合的类型不应用作模板类型参数的模板参数。
[例:
template <class T> class X { /* ... */ };
void f()
{
struct S { /* ... */ };
X<S> x3; // error: local type used as template-argument
X<S*> x4; // error: pointer to local type used as template-argument
}
-end example] [注意:模板类型参数可能是不完整类型(3.9)。 ]
在C ++ - 0x中,此限制被删除;在同一部分中,新标准草案(N3126)在示例中明确显示:
[例如:
template <class T> class X { };
template <class T> void f(T t) { }
struct { } unnamed_obj;
void f() {
struct A { };
enum { e1 };
typedef struct { } B;
B b;
X<A> x1; // OK
X<A*> x2; // OK
X<B> x3; // OK
f(e1); // OK
f(unnamed_obj); // OK
f(b); // OK
}
- 结束示例] [注意:模板类型参数可能是不完整类型(3.9)。 - 结束说明]
g ++ 4.5.1 编译你的代码 (与 -std=c++0x
选项)。
您的第二个代码示例在C ++ 03中格式不正确1 但在C ++ 0x中有效
std::transform
是
template < class InputIterator, class OutputIterator, class UnaryOperator >
OutputIterator transform ( InputIterator first1, InputIterator last1,
OutputIterator result, UnaryOperator op );
但是g ++ 4.4 不支持本地类型作为模板参数 (即使 -std=c++0x
选项]所以你得到一个错误。
1:本地类型,没有链接的类型,未命名的类型或从这些类型中的任何类型复合的类型不应该用作模板类型参数的模板参数。 (ISO C ++03§14.3.1.2)