类中的模板函数错误(C ++)

时间:2017-01-06 04:51:16

标签: c++ c++11 templates

我在写作课程中遇到模板功能方面的困难。我已经将它简化为一组简洁的示例,以便于演示(这证明我在这里缺少或搞砸了一个基本概念)。

基本上,如果我在类之外定义此函数,或者如果我将其设置为成员函数,它将完美地运行。这两个例子有效:

作为会员功能......

// 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");

但这也无济于事。任何帮助或澄清将不胜感激。

谢谢。

0 个答案:

没有答案