gpt4 book ai didi

c++ - "No matching function"模板函数接受回调

转载 作者:太空狗 更新时间:2023-10-29 20:44:52 24 4
gpt4 key购买 nike

我正在尝试将回调传递给模板函数,但 GCC 给了我

error: no matching function for call to ‘Test::iterate(main(int, char**)::<anonymous struct>&)’

为什么这行不通?(此外,由于我无法控制的原因,我无法使用 C++11。)

我也试过命名结构,例如myvis并调用 test.iterate<myvis>(visitor) ,但这也不起作用。

#include <deque>
#include <iostream>

class Test {
public:
std::deque<int> d;

template <typename C>
void iterate(C& c) {
for(std::deque<int>::iterator itr = d.begin(); itr != d.end(); itr++) {
c(*itr);
}
}
};

int main(int argc, char** argv) {
Test test;
test.d.push_back(1);
test.d.push_back(2);
struct {
void operator()(int x) {
std::cout << x << std::endl;
}
} visitor;
test.iterate(visitor);
}

最佳答案

C++03 标准在 §14.3.1.2 [temp.arg.type] 中说明如下:

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.

因此你需要一个全局的命名结构而不是一个局部的未命名结构,给你类似下面的东西:

struct Visitor {
void operator()(int x) {
std::cout << x << std::endl;
}
} visitor;
int main(int argc, char** argv) {
Test test;
test.d.push_back(1);
test.d.push_back(2);
Visitor visitor;
test.iterate(visitor);
}

在 c++11 中取消了对本地/未命名类型的限制,所以如果那些不使用它的原因有一天会消失,您的代码将保持原样。

关于c++ - "No matching function"模板函数接受回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12045029/

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