模板化函数参数的显式模板实例化
Explicit template instantiation for a templated function parameter
我想在 .cpp
文件中编写模板函数的定义,而不是在 header.
中
让我们举个简单的例子:
// func.h
template <class T>
void print_message(T func) {
func();
}
// main.cpp
#include <iostream>
#include "func.h"
void say_hello() {
std::cout << "hello" << std::endl;
}
int main(int argc, char* argv[]) {
print_message(say_hello);
return 0;
}
如何根据 here.
的描述在 .cpp
文件中显式模板实例化 print_message
函数
我尝试了以下代码片段,但出现此错误:explicit instantiation of 'print_message' does not refer to a function template, variable template, member function, member class, or static data member
。
// func.h
template <class T>
void print_message(T func) {
func();
}
// main.cpp
#include <iostream>
#include "func.h"
void say_hello() {
std::cout << "hello" << std::endl;
}
template void print_message<say_hello>(say_hello func);
int main(int argc, char* argv[]) {
print_message(say_hello);
return 0;
}
问题不在于您在源代码中提供了定义。您确实将定义放在 header 中。此外,您的示例中只有一个翻译单元。如果将所有代码都放在 main.cpp
.
中,错误将是相同的
问题是 print_message
有类型参数,但 say_hello
不是类型。
编译没有错误:
#include <iostream>
// func.h
template <class T>
void print_message(T func) {
func();
}
// main.cpp
void say_hello() {
std::cout << "hello" << std::endl;
}
template void print_message<decltype(&say_hello)>(decltype(&say_hello) func);
int main(int argc, char* argv[]) {
print_message(&say_hello);
return 0;
}
我想在 .cpp
文件中编写模板函数的定义,而不是在 header.
让我们举个简单的例子:
// func.h
template <class T>
void print_message(T func) {
func();
}
// main.cpp
#include <iostream>
#include "func.h"
void say_hello() {
std::cout << "hello" << std::endl;
}
int main(int argc, char* argv[]) {
print_message(say_hello);
return 0;
}
如何根据 here.
的描述在.cpp
文件中显式模板实例化 print_message
函数
我尝试了以下代码片段,但出现此错误:explicit instantiation of 'print_message' does not refer to a function template, variable template, member function, member class, or static data member
。
// func.h
template <class T>
void print_message(T func) {
func();
}
// main.cpp
#include <iostream>
#include "func.h"
void say_hello() {
std::cout << "hello" << std::endl;
}
template void print_message<say_hello>(say_hello func);
int main(int argc, char* argv[]) {
print_message(say_hello);
return 0;
}
问题不在于您在源代码中提供了定义。您确实将定义放在 header 中。此外,您的示例中只有一个翻译单元。如果将所有代码都放在 main.cpp
.
问题是 print_message
有类型参数,但 say_hello
不是类型。
编译没有错误:
#include <iostream>
// func.h
template <class T>
void print_message(T func) {
func();
}
// main.cpp
void say_hello() {
std::cout << "hello" << std::endl;
}
template void print_message<decltype(&say_hello)>(decltype(&say_hello) func);
int main(int argc, char* argv[]) {
print_message(&say_hello);
return 0;
}