当前位置: 首页 > 知识库问答 >
问题:

C模板类成员函数特化

宋瀚海
2023-03-14

我有一个问题,我想在下面的代码中专门化模板类的模板成员函数。这个问题的答案是模板类成员函数的显式特化,这似乎表明它无法完成。这是正确的吗,如果是这样,我可以使用任何解决方法,以便在编译时通过内联inc函数进行扩展?

非常感谢!

#include <iostream>
#include <cstdio>

template <class IT, unsigned int N>
struct IdxIterator {
private:
  int startIdx[N], endIdx[N];  
  int curIdx[N];
  IT iter;

public:
  IdxIterator(IT it, int cur[], int start[], int end[]): iter(it) {
    for (int i = 0; i < N; i++) {
      curIdx[i] = cur[i];
      startIdx[i] = start[i];
      endIdx[i] = end[i];
    }
  }

  template <int dim>
  inline void inc() {
    curIdx[dim]++;
    if (curIdx[dim] > endIdx[dim]) {
      if (dim > 0) {
        curIdx[dim] = startIdx[dim];
        inc<dim-1>();
      }
    }
  }

  // how to declare this specialization?
  template <> template <>
  inline void inc<-1>() {
    std::cerr << "IdxIterator::inc(" << -1 << ") dim out of bounds!\n";
    throw 1;
  }

  inline IdxIterator<IT, N> operator++() {
    iter++;
    inc<N-1>();
    return *this;
  }

};

int main(int argc, char** argv) {

  int *buf = new int[100];
  int start[1], end[1];
  start[0] = 0; end[0] = 99;
  IdxIterator<int*, 1> it(buf, start, start, end);
  ++it;

  return 0;

}

g吐槽道:

test2.cpp:32:13: 错误: 非命名空间作用域中的显式专用化 'struct IdxIterator' test2.cpp:32:25: 错误: 非命名空间作用域中的显式专用化 'struct IdxIterator' test2.cpp:33:23: 错误: template-id 'inc

test2.cpp: 在全局范围内: test2.cpp:22:15: 警告: 内联函数 'void IdxIterator::inc() [int dim = -0x000000000000003ff, IT = int*, unsigned int N = 1u]' 已使用但从未定义 [默认启用]

共有3个答案

贲绪
2023-03-14

在类之外创建一个助手结构

template<dim>
struct inc {
template<class cur, end>
      inline static void foo(cur curIdx, end endIdx) {
        curIdx[dim]++;
    if (curIdx[dim] > endIdx[dim]) {
        inc<dim-1>::foo(curIdx, endIdx);
      }
    }    
};

template<>
struct inc<0> {
    template<class cur, end>
      inline static void foo(cur, end) {
       //terminate
    }    
};

class IdxIterator {
       template<int i>
       void inc() {
        static_assert(i > 0, "error out of bounds");
         int<i>::foo(/*params*/); 
    }

};

注意:如果使用GCC,可以< code > _ _ attribute _ _((always _ inline))强制内联。

储仲渊
2023-03-14

您可以按照编译器错误消息的建议进行操作:

template <class IT, unsigned int N>
struct IdxIterator {
private:
  template <int dim>
  inline void inc() {
    curIdx[dim]++;
    if (curIdx[dim] > endIdx[dim]) {
      if (dim > 0) {
        curIdx[dim] = startIdx[dim];
        inc<dim-1>();
      }
    }
  }
};

template <> template <>
inline void IdxIterator::inc<-1>() {
  std::cerr << "IdxIterator::inc(" << -1 << ") dim out of bounds!\n";
  throw 1;
}

ie将定义移动到命名空间范围。

薛高澹
2023-03-14

在C 11中可能有更好的方法,但你总是可以通过重载而不是特化:

template <int N>
struct num { };

class A
{
    template <int N>
    void f(num <N>) { };

    void f(num <-1>) { };

public:
    template <int N>
    void f() { f(num <N>()); };
};
 类似资料:
  • 我有一个模板化的C++类,它也有一个模板化的成员函数。这个成员函数的模板参数以特定的方式依赖于类的模板参数(请参阅下面的代码)。我正在为其模板参数的两个不同值实例化(而不是专门化)该类。一切都在这一点上进行。但是,如果我调用模板化的成员函数,对第一个实例化对象的调用只会编译,而不会编译第二个。似乎编译器没有为模板类的第二次实例化实例化模板化成员函数。我正在使用“g++filename.cpp”编译

  • 是否有人知道此显式特化是否有效: clang 主干 (12/3/2013) 给出以下错误: f:...\test.cpp:36:20: 错误: 从类 'O' 中出线定义 “Fun” 没有定义 1生成错误。 任何来自标准的支持参考来证明你的答案将不胜感激! 注意:我有点惊讶这是一个错误——我认为应该为任何以< code >开始实例化“Fun”的模板参数族选择专门化 这是一个叮当的错误还是我期望中的错

  • C++ 类 & 对象 类的成员函数是指那些把定义和原型写在类定义内部的函数,就像类定义中的其他变量一样。类成员函数是类的一个成员,它可以操作类的任意对象,可以访问对象中的所有成员。 让我们看看之前定义的类 Box,现在我们要使用成员函数来访问类的成员,而不是直接访问这些类的成员: class Box { public: double length; // 长度

  • 假设我有一个模板类Foo,具有两个模板参数和一个模板成员函数。 我想在模板类是部分专门化的情况下进行成员函数专门化,但以下代码被g编译失败 G说: 错误:在' 模板 我试过了 而g抱怨更多 能不能可能,怎么做?

  • 我试图做到以下几点:一个模板化的类应该提供一些函数,这些函数取决于它模板化的类型是否包含一个具有给定名称的成员变量。作为示例,下面的伪代码应该只在模板化的结构/类具有名为“id”的成员时才提供“printId()”: 通过研究SFINAE,traits,std::enable_if和StackOverflow,我认为这是可以做到的...但是我不知为什么没有将enable_if与以下问题中的片段结合