从模板类中调用模板函数

时间:2011-01-24 06:51:38

标签: c++ templates gcc cuda

GCC不会编译以下代码片段(实际上它是GCC的正确行为,因为它符合我已经学过的标准C ++。但VC ++会编译。)

template<class T>
void CUDAMemory1D2DTextureAllocator<T>::allocateMemoryOnDevice()
{
    m_pChannelDesc = cudaCreateChannelDesc<T>();
    ...
}

正如我已经通过搜索发现的那样,需要告诉编译器cudaCreateChannelDesc是模板方法。否则它会尝试 将<解析为小于运算符...

以下代码段以简单的示例显示:

template< typename G >
struct Test
{
    template< typename T > T f() const;
};

template< typename G, typename T >
void g()
{
    Test< G > t;

    t.f< T >();           // ERROR: gcc won't compile that
    t.template f< T >();  // OK: now gcc knows that f is a template method an treads the following angle brackets  not as operators but as template brackets...
} 

到目前为止一切顺利。现在我的问题是,在上面的例子中如何做到这一点,我调用的方法是cudaCreateChannelDesc,它不属于任何类或命名空间? 任何建议或建议如何解决这种情况都是非常受欢迎的。

由于

3 个答案:

答案 0 :(得分:2)

如果它不属于任何类或命名空间,您可以直接调用它:cudaCreateChannelDesc<T>()。这不是那样的吗?

答案 1 :(得分:2)

我假设cudaCreateChannel1Desc不是全局或命名空间函数,因为它应该有效,除非你忘记了include或命名空间解析。而你确实说它是一种“方法”,即成员函数。

因此,如果它是类CUDAMemory1D2DTextureAllocator的方法,那么您应该使用this->template cudaCreateChannel1Desc<T>()来调用该方法(我推断的是CUDAMemory1D2DTextureAllocator模板化基类的方法下面是一个紧凑的例子,说明在不同情况下(至少在gcc上)有效和无效的内容:

template <class G>
struct Base {

  template< class T > 
  T h() const {
    std::cout << "Hello World!" << std::endl;
  };
};

template< class G >
struct Test : public Base<G>
{
    template< class T > 
    T f() const {
      std::cout << "Hello World!" << std::endl;
    };

    void callF() const {
      f<G>();                //works!
      this->f<G>();          //works!
      h<G>();                //ERROR!
      this->h<G>();          //ERROR!
      this->template h<G>(); //works!
    };
};

答案 2 :(得分:1)

是否在范围内的某个命名空间中声明了cudaCreateChannelDesc函数?看起来您可能遇到两阶段名称查找问题,这要求模板中引用的某些实体(如函数)甚至在实例化模板之前也是可见的。如果在与allocateMemoryOnDevice定义相同的位置编写非模板化函数并在其中调用cudaCreateChannelDesc,代码是否编译?如果没有,您可能会错过#include上的cudaCreateChannelDesc或命名空间资格。