我有一个非常简单的项目,其中包含两个源和一个标头:
math_precision_io_test.cc
(包含main
)。 main
包含以下几行:
int retval = 0;
retval = write_datum<float>(file1, &f2, "float");
retval = write_datum<double>(file2, &d2, "double");
math_precision_io.cc
,包含要使用的功能,包括
template<class T>
int write_datum(std::ofstream & file, const T * datum, const char* descr) {
static_assert(std::is_same<T, double>::value ||
std::is_same<T, float>::value ||
std::is_same<T, int>::value ||
std::is_same<T, char>::value,
"write_datum is not defined on this class");
if (file.good()) {
const size_t data_size = sizeof(T);
file.write((char *) datum, data_size);
if (descr != NULL) {
std::cout << "Writing datum " << descr << std::endl;
}
return 0;
} else {
return 1;
}
}
math_precision_io.h
(包含在math_precision_io_test.cc
中,以及其他声明)
template<class T>
int write_datum(std::ofstream & file, const T * datum, const char* descr = NULL);
两个源都可以正常编译(将对象放置在目录obj/
中)。
与
g++ -g -g3 -Wall -Wunused -Wuninitialized -Wextra -fmessage-length=0 -std=gnu++11 -o math_precision_io_test obj/math_precision_io_test.o obj/math_precision_io.o
我明白了
math_precision_io_test.cc:74: undefined reference to `int write_datum<float>(std::basic_ofstream<char, std::char_traits<char> >&, float const*, char const*)'
math_precision_io_test.cc:75: undefined reference to `int write_datum<double>(std::basic_ofstream<char, std::char_traits<char> >&, double const*, char const*)'
但是,如果仅将功能行write_datum
从math_precision_io.cc
移到math_precision_io_test.cc
,进行编译和链接,该错误就会消失。
我不明白为什么。
该错误的原因是什么,如何解决? (这意味着将函数定义保留在math_precision_io.cc
中,然后链接正常)。
注意:我发现的问题的答案确实存在于顶部链接至的问题的答案中。 但是问题本身就不同了,可能无法立即找到两者之间的联系。这正是我发生的事情(否则,我不会问这个问题)。