假设我在animal.hpp文件中声明了这个模板类:
enum class ANIMAL_TYPE{
DOG,
CAT,
};
template <ANIMAL_TYPE T>
class animal{
public:
void makeSound();
};
字符串
在解释接口和继承时使用的非常经典的例子,但我希望它在编译时就知道,而不是一个虚函数,所以我在animal.cpp文件中实现了它:
template <>
class Animal<ANIMAL_TYPE::DOG>{
public:
void makeSound(){
std::cout << "woof";
}
};
template <>
class Animal<ANIMAL_TYPE::CAT>{
public:
void makeSound(){
std::cout << "MEOW";
}
};
template class Animal<ANIMAL_TYPE::DOG>;
template class Animal<ANIMAL_TYPE::CAT>;
型
在主文件中:
#include <animal.hpp>
int main(){
Animal<ANIMAL_TYPE::DOG> doggy;
doggy.makeSound();
return 0;
}
型
但是当我编译并链接它时,我在链接“undefined reference to Animal<(ANIMAL_TYPE)0>::makeSound
”时得到一个错误。
1条答案
按热度按时间wa7juj8i1#
您应该示例化方法,而不是示例化类本身。换句话说,与其这样做:
字符串
你应该这样做:
型
另外,我注意到在
animal.cpp
的底部有这个。型
在这种情况下,它们没有任何效果,您可以删除它们。
**EDIT:**好的,所以如果你想有两个模板参数,一个是类型,一个不是类型,你需要直接示例化类,在头部因为它仍然是一个模板,而不是一个完整的示例化。
例如,假设前面的
Animal
类接受了一个类型参数。型
你必须像这样示例化它(记住把它放在头文件中,因为它仍然是一个模板,而不是一个完整的示例化)。
型
希望这对你有帮助。