我在写作课程中遇到模板功能方面的困难。我已经将它简化为一组简洁的示例,以便于演示(这证明我在这里缺少或搞砸了一个基本概念)。
基本上,如果我在类之外定义此函数,或者如果我将其设置为成员函数,它将完美地运行。这两个例子有效:
作为会员功能......
// testing.hpp:
class testing {
public:
template <typename T>
T getVal(std::string szKeyName, T TDefaultVal) {
return TDefaultVal;
}
};
// main.cpp:
#include "testing.hpp"
int main(int argc, const char * argv[]) {
testing x;
std::string st = x.getVal("ConfigKey", "ConfigVal");
std::cout << "Returned value is: " << st << std::endl;
return 0;
}
单机...
template <typename T>
T getVal(std::string szKeyName, T TDefaultVal) {
return TDefaultVal;
}
int main(int argc, const char * argv[]) {
std::string st = getVal("ConfigKey", "ConfigVal");
std::cout << "Returned value is: " << st << std::endl;
return 0;
}
但是,如果我将测试类的声明和实现分开,则它不起作用:
// testing.hpp
class testing {
public:
template <typename T>
T getVal(std::string szKeyName, T TDefaultVal);
};
// testing.cpp
#include "testing.hpp"
template <typename T>
T testing::getVal(std::string szKeyName, T TDefaultVal) {
return TDefaultVal;
}
// main.cpp
#include "testing.hpp"
int main(int argc, const char * argv[]) {
testing x;
std::string st = x.getVal("ConfigKey", "ConfigVal");
std::cout << "Returned value is: " << st << std::endl;
return 0;
}
上述内容无法编译:
架构x86_64的未定义符号:&#34; char const * testing :: getVal(std :: __ 1 :: basic_string,std :: __ 1 :: allocator&gt;,char const *)&#34;,引自: _main in main.o ld:找不到架构x86_64 clang的符号:错误:链接器命令失败,退出代码为1(使用-v查看 调用)
这真的令人沮丧,因为我觉得我真的应该能够找出问题所在,但经过一段时间的修补我无法做到,所以我希望有人可以把我拉开帷幕这里。值得注意的是,无论我使用什么类型 - std :: string,int等 - 我都会收到链接器错误。我也尝试用
调用该函数std::string st = x.getVal<std::string>("ConfigKey", "ConfigVal");
但这也无济于事。任何帮助或澄清将不胜感激。
谢谢。