关于C ++模板中的错误

时间:2013-11-28 02:34:59

标签: c++ templates

我在编写C ++模板时遇到问题,让我们检查一下代码:

abc.h

class ABC
{
public:
        template <class T>
        T getSomething(const std::string& name, ABC* owner = 0);
        ABC* getSomething(const std::string& name);
};

abc.cpp


#include "abc.h"

template <class T>
T ABC::getSomething(const std::string& name, ABC* owner)
{
        return dynamic_cast<T>(owner ? owner->getSomething(name) : getSomething(name));
}


ABC* ABC::getSomething(const std::string& name)
{
        return NULL;
}

我的主要功能如下:

int main()
{
        ABC abc;
        ABC* test = abc.getSomething<ABC*>("hello", NULL);
}

当我把我的主要放在这个abc.cpp并编译它时,没有问题一切正常

但是当我使用这个abc.cpp(后来我把它编译成abc.o)然后把我的main函数放在不同的文件中(比如说def.cpp)时就会出现问题。

我得到了非常奇怪的错误,错误说:

/tmp/ccn1H4Bg.o: In function `main':
def.cpp:(.text+0x4a): undefined reference to `ABC* ABC::getSomething<ABC*>(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ABC*)'
collect2: ld returned 1 exit status
你能帮我解决我在这里做错的事吗?

谢谢大家!

1 个答案:

答案 0 :(得分:2)

这是因为编译器不支持编译的单独模板。将abc.cpp中的模板代码移动到abc.h可以解决这个问题。像这样:

//abc.h
class ABC
{
public:
        template <class T>
        T getSomething(const std::string& name, ABC* owner = 0);
        ABC* getSomething(const std::string& name);
};

template <class T>
T ABC::getSomething(const std::string& name, ABC* owner)
{
        return dynamic_cast<T>(owner ? owner->getSomething(name) : getSomething(name));
}

//abc.cpp
ABC* ABC::getSomething(const std::string& name)
{
        return NULL;
}

//def.cpp
int main()
{
        ABC abc;
        ABC* test = abc.getSomething<ABC*>("hello", NULL);
}