gpt4 book ai didi

c++ - 为什么使用局部结构作为 STL 函数参数的代码不能在 g++ 中编译?

转载 作者:可可西里 更新时间:2023-11-01 15:09:34 26 4
gpt4 key购买 nike

我有这样的代码运行良好:

#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;
}

它不会编译,说:

error: no matching function for call to ‘transform(char [11], char*, char [11], main()::F)’

怎么了?

gcc版本为4.4,不识别lambda表达式。

最佳答案

在 C++-98/03 中,第二个代码无效,因为 F 是本地类型;事实上,在 §14.3.1.2 中声明

A local type, a type with no linkage, an unnamed type or a type compounded from any of these types shall not be used as a template-argument for a template type-parameter.

[Example:

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] [Note: a template type argument may be an incomplete type (3.9). ]

在 C++-0x 中这个限制被移除;在同一节中,新标准草案 (N3126) 在示例中明确说明了这一点:

[ Example:

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
}

— end example ] [ Note: a template type argument may be an incomplete type (3.9). — end note ]

关于c++ - 为什么使用局部结构作为 STL 函数参数的代码不能在 g++ 中编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4569928/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com