Вызов функции шаблона из класса шаблона - PullRequest
4 голосов
/ 24 января 2011

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 ]

2 голосов
/ 24 января 2011

Вы можете вызвать его напрямую как: cudaCreateChannelDesc<T>(), если он не принадлежит ни к какому классу или пространству имен.Разве это не работает так?

2 голосов
/ 24 января 2011

Я предполагаю, что cudaCreateChannel1Desc не является глобальной функцией или функцией пространства имен, потому что это должно сработать, если вы не забыли включение или разрешение пространства имен.И вы говорите, что это «метод», то есть функция-член.

Итак, если это метод класса CUDAMemory1D2DTextureAllocator, то вы должны использовать this->template cudaCreateChannel1Desc<T>() для вызова этого метода (который у меня естьdeduced - это метод шаблонного базового класса 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!
    };
};
1 голос
/ 24 января 2011

Объявлена ​​ли функция cudaCreateChannelDesc в некотором пространстве имен, которое у вас есть в области видимости? Похоже, что у вас могут быть проблемы с двухфазным поиском имени, который требует, чтобы некоторые сущности (например, функции), на которые ссылаются шаблоны, были видны даже до создания экземпляра шаблона. Если вы пишете функцию без шаблонов в том же месте, где вы определили allocateMemoryOnDevice, и вызываете cudaCreateChannelDesc внутри нее, компилируется ли код? Если нет, возможно, вам не хватает #include или квалификации пространства имен в cudaCreateChannelDesc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...