在可变参数模板参数列表中传递 const char* 会导致链接器错误

Passing const char* in variadic template argument list results in linker errors

我有以下模板 class 异常构造函数 class:

MyCustomException.h:

template<typename ... Args>
MyCustomException(const Message& msg, const char* fileName, int line, Args&& ... args);

MyCustomException.cpp:

template<typename ... Args>
MyCustomException(const Message& msg, const char* fileName, int line, Args&& ... args) {
  // random magic here
}

现在,当我尝试将 const char* 传递给它时(例如 main.cpp):

#include "MyCustomException.h"

// ...

void myFunc() {

  try {
    // ...
    const Message m { id, msg };
    const char* mychar { "test string" };
  
    if (someCondition) {
      throw MyCustomException(m, __FILE__, __LINE__, mychar);
    }
  catch (MyCustomException& e) {
    // ...
  }
}

// ...

int main() {
  myFunc();
}

我不断收到链接器错误 LNK2019(未解析的外部符号):

public: __cdecl MyCustomException::MyCustomException<char const *>(class Message const &,char const *,int,char const *)

向其传递字符串文字时,一切正常。

可变模板参数和 const char* 有什么关系?

问题在于在单独的 .cpp 文件中定义模板构造函数。 如G.M。链接到评论中的 this post,模板成员应在头文件中实现,或者在 .cpp 文件中定义时,至少为每个实例明确定义。