非模板类中的某些模板函数

时间:2014-07-26 19:24:03

标签: c++ templates

我试图创建一个类,它将包含两对模板函数:一个用于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);
};

4 个答案:

答案 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)
{
  ...
}