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
,它不属于任何类或命名空间?
任何建议或建议如何解决这种情况都是非常受欢迎的。
由于
答案 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
或命名空间资格。