【问题标题】:Using const char** with Template Specialization将 const char** 与模板专业化一起使用
【发布时间】:2014-06-27 06:39:46
【问题描述】:

我正在尝试为一个函数编写模板特化,该函数返回数值数组的最大值(通用版本)或 c 字符串数组的最长 c 字符串(特化)。如果我不使用 const-ness,我的函数原型看起来像这样

template <typename T>
T maxn(T* my_Tptr, unsigned int n);

template <>
char* maxn <char*> (char** my_cstrings, unsigned int n);

我的代码编译了。

但是,如果我尝试使用 const-ness,我的函数原型看起来像这样,

template <typename T>
T maxn(const T* my_Tptr, unsigned int n);

template <>
char* maxn <char*> (const char** my_cstrings, unsigned int n);

我的代码没有编译,编译器 (gcc) 打印出这个错误:

错误:'char* maxn(const char**, unsigned int)' 的模板 ID 'maxn' 与任何模板声明都不匹配。

我哪里错了?

【问题讨论】:

  • 我不介意,但我真的想知道为什么您需要在源代码中进行构造?
  • template &lt;&gt; char const* maxn &lt;char const*&gt; (char const* const*, unsigned int);template &lt;&gt; char* maxn &lt;char*&gt; (char* const*, unsigned int);

标签: c++ templates constants template-specialization specialization


【解决方案1】:

问题出在constness。如果你仔细观察 const T* my_Tptr 意味着 my_Tptr 是一个指向 const T 的指针。但是const char** my_Tptr 表示Tptr 是一个指向const char 的指针。所以类型从 pointer to const T 移动到 pointer to pointer to const T。如果您将其设为char* const* my_Tptr*,那么它将起作用,因为那时类型将是指向 const char 指针的指针。特化是pointer to const T*->pointer to const char*

【讨论】:

    【解决方案2】:

    不确定它背后的整个逻辑是什么,但如果您更改模板定义以表示您期望指针会有所帮助:

    template <typename T>
    T* maxn(const T** my_Tptr, unsigned int n);
    
    template <>
    char* maxn(const char** my_cstrings, unsigned int n);
    

    【讨论】:

      【解决方案3】:

      您可以为 char-case 提供几个重载来解决问题:

      #include <iostream>
      #include <stdexcept>
      
      template <typename T>
      T maxn(const T* const data, unsigned int n) {
          throw std::logic_error("Failure");
      }
      
      const char* maxn(const char * const * data, unsigned int n) {
          return "Success";
      }
      
      inline const char* maxn(const char** data, unsigned int n) {
          return maxn(static_cast<const char * const *>(data), n);
      }
      
      inline const char* maxn(char* const * data, unsigned int n) {
          return maxn(static_cast<const char * const *>(data), n);
      }
      
      inline const char* maxn(char** data, unsigned int n) {
          return maxn(static_cast<const char * const *>(data), n);
      }
      
      int main() {
          const char* a[] = { "A", "B", "C" };
          std::cout << maxn((const char * const *)a, 3) << '\n';
          std::cout << maxn((const char **)a, 3) << '\n';
          std::cout << maxn((char * const *)a, 3) << '\n';
          std::cout << maxn((char**)a, 3) << '\n';
      }
      

      【讨论】:

        【解决方案4】:

        这编译得很好:

        template <>
        char* maxn(char* const* my_cstrings, unsigned int n);
        

        它接受一个指向 const char 指针的指针,就像在基本模板中指定的那样。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-07-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-18
          • 1970-01-01
          • 2022-01-10
          • 1970-01-01
          相关资源
          最近更新 更多