我试图创建一个类,它将包含两对模板函数:一个用于char,另一个用于wchar_t。我编写了以下代码,但它无法构建,因为链接器无法找到函数的实现。我认为问题在于链接器认为类中的函数不是模板函数的实例。
如何定义所需的功能?
template<typename T>
int func1(const T* szTarget)
{
...
}
template<typename T>
T* func2(const T* szTarget)
{
...
}
class MyClass
{
public:
int func1(const char* szTarget);
int func1(const wchar_t* szTarget);
char* func2(const char* szTarget);
wchar_t* func2(const wchar_t* szTarget);
};
答案 0 :(得分:3)
实际上,您在课堂范围之外定义了两个模板功能,它们与您的课程无关。
为什么不呢:
class MyClass
{
public:
template<typename T>
int func1(const T* szTarget)
{
/* ... */
}
template<typename T>
T* func2(const T* szTarget)
{
/* ... */
}
};
顺便说一下,你应该尝试使用范围和命名来理解它:http://ideone.com/65Mef5
答案 1 :(得分:1)
怎么样?
class MyClass {
public:
template<typename T>
int func1(T* szTarget) {
// provide appropriate implementation
}
template<typename T>
char* func2(T* szTarget) {
// provide appropriate implementation
}
};
答案 2 :(得分:0)
编译器是对的。
您必须将模板函数声明为类的成员。这意味着它们需要在类声明中声明。
class MyClass
{
public:
template<typename T>
int func1(const T* szTarget)
{
...
}
template<typename T>
T* func2(const T* szTarget)
{
...
}
template <> int func1(const char* szTarget) { } //specialization
template <> int func1(const wchar_t* szTarget) { } //specialization
template <> char* func2(const char* szTarget) { } //specialization
template <> wchar_t*func2(const wchar_t* szTarget) { } //specialization
};
答案 3 :(得分:0)
您尚未在班级中定义任何模板化方法。一种方法如下:
class MyClass
{
public:
template <typename T> int func1(const T* szTarget);
template <typename T> T* func2(const T* szTarget);
};
template<typename T>
int MyClass::func1<T>(const T* szTarget)
{
...
}
template<typename T>
T* MyClass::func2<T>(const T* szTarget)
{
...
}