将lambda传递给模板类中的方法(头文件/源文件问题)
C++ Pass lambda to a method in template class (header/source files issue)
我在传递lambda表达式作为模板类方法的参数时遇到问题。
如果我编译以下代码:
main.cpp:
#include "a.h"
int main(int argc, char** argv) {
A<int> o;
o.a([&](){ });
}
a.h:
template <typename T>
class A {
public:
template <typename Lambda>
void a(const Lambda& f) {
f();
}
};
工作正常
然而,我不想在a.h中实现类A,我想把代码放在单独的cpp文件中。现在我有了
main.cpp:
不变a.h:
template <typename T>
class A {
public:
template <typename Lambda>
void a(const Lambda& f);
};
a.cpp:
#include "a.h"
template <typename T>
template <typename Lambda>
void A<T>::a(const Lambda& f) {
f();
}
template class A<int>;
我现在得到以下错误:
In file included from test.cpp:1:0:
a.h:7:7: error: 'void A<T>::a(const Lambda&) [with Lambda = main(int, char**)::__lambda0; T = int]', declared using local type 'const main(int, char**)::__lambda0', is used but never defined [-fpermissive]
void a(const Lambda& f);
^
为什么?我该怎么修理它?
我注意到,如果我把所有的东西都放在同一个cpp文件,它工作。这个问题只发生在我想这样分割它的时候,这是保持我的代码有条理所必需的。
谢谢你的回答
这很奇怪,因为即使这样也能工作:
main.cpp
#include "a.h"
int main(int argc, char** argv) {
A<int> o;
o.a([&](){ });
}
template <typename T>
template <typename Lambda>
void A<T>::a(const Lambda& f) {
f();
}
template class A<int>;
a.h
template <typename T>
class A {
public:
template <typename Lambda>
void a(const Lambda& f);
};
这工作。出于某种原因,当我在两个不同的cpp文件中分离main()和方法实现时,它将不起作用。
为什么?
好的,我想我找到一个解释了。
当你将模板类的代码拆分为。h和。cpp时,你需要使模板实例化显式。
问题是lambda表达式没有指定的类型,因此不可能为lambda类型编写该函数的模板显式实例。
我想要的是不可能的是否有可能显式特化模板以匹配lambda?
一般来说,你不能真正把模板函数/类的实现放在。cpp文件中。原因是,当.cpp文件单独编译时,编译器无法知道将向其传递哪些模板参数。因此,我认为根据您的情况,最好将所有内容留在头文件中。
正如其他人所说,不可能将模板类与其头文件和cpp文件中的实现分开。但是,如果类本身不是模板,而是其中一个成员函数接受lambda,则可以分离实现。要做到这一点,不要使用template来声明lambda。使用std::function
代替。
头文件a.h
.
#include <functional>
namespace xx {
struct A {
void square(int num, std::function<void(int)>consumer);
};
}
CPP文件a.cpp
.
namespace xx {
void A::square(int num, std::function<void(int)>consumer) {
consumer(num * num);
}
}
按如下方式使用
#include "a.h"
#include <assert.h>
int main() {
xx::A a;
a.square(10, [](int result) {
assert(result == 100);
});
return 0;
}
相关文章:
- 如何使用curlpp通过POST方法上传文件和json数据
- 一种在C++中读取TXT配置文件的简单方法
- 在 cpp 文件中隐藏采用模板参数引用的方法
- 在C++中包含原型文件的正确方法是什么?
- 通过比较C++中的行在 txt 文件中搜索的最简单方法是什么?
- 不带预处理器的调用方法/文件的文件名/行号
- 引用文件的适当方法是什么?
- 在文件中写入而不是在 c++ 中使用 "<<" 的替代方法?
- 查找定义我的 C/C++ 函数/宏的文件比'grep'更简单的方法
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?
- 在C++中创建文件夹选取器对话框的最简单方法是什么?
- C++:std::ofstream 方法 open() 在第二次迭代时擦除打开的 ifstream 文件
- 如何使用 C/C++ 和 system() 系统调用以外的其他方法在 Linux 中获取文件功能?
- 创建进行生产构建并创建调试信息的C++生成文件的最佳方法?
- 是否有正确的方法对生成文件中的对象文件使用模板命令?(C++)
- 将位字符串转储到二进制文件的最佳方法是什么
- 在目录中查找所有.cpp.h文件(include,src等)的传统方法
- 通过boost asio iostream下载大文件的最快方法是什么?
- LNK2019 在文件中调用静态成员的方法时出错.cpp
- 在 *.cpp 文件中实现的 c++ 函数/方法永远不会内联扩展吗?