2013-08-22 6 views
0

Можно ли передать параметры шаблона функции, заданной в другом месте? Например у меня есть классШаблонные параметры класса для внешней функции

Barrier.pp

template<Location L, Knock K> 
class Barrier 
{ 
    //... 
    void checkBarrier(...) 
    { 
    BarrierBest_checkBarrier<L, K>(...); 
    } 
    //... 
} 

Other.cpp

template<Location L, Knock K> 
BarrierBest_checkBarrier(...) 
{ 
    //Use L and K to do call other function 
} 

Как я это прямо сейчас компилятор бросает неразрешенный внешний символ для всех возможные комбинации параметров шаблона, то есть BarrierBest_checkBarrier<1,1>, BarrierBest_checkBarrier<1,0>, BarrierBest_checkBarrier<0,1>, BarrierBest_checkBarrier<0,0>

Есть ли способ сделать эту работу?

+0

Шаблоны, которые нуждаются в видимости в нескольких единицах перевода (файлы cpp), должны быть определены в заголовочных файлах и включены в оба. – metal

+0

Укажите код, который дает ту же ошибку, о которой идет речь. – Oswald

ответ

0

Проблема может заключаться в том, что ваши шаблонные функции находятся в файлах cpp, а не в заголовках. Параметры шаблона должны быть известны во время компиляции. Если у вас есть отдельные единицы компиляции, это не так.

+0

Я определил функции в отдельном файле заголовка и включил его в оба файла, но все равно получаю те же сообщения. Функция 'BarrierBest_checkBarrier' не является частью какого-либо класса, это всего лишь метод, который помогает мне обернуть вызов другим вещам (ядра CUDA). Кстати, возможно, это глупый вопрос, но лучше спросить, есть ли проблема, если заголовочный файл имеет расширение «.cuh» – BRabbit27

+0

Не должно быть проблем с разным расширением заголовка. Все определения находятся в заголовке, а не только в объявлениях? –

+0

Прочитав много раз ответы, я понимаю, что может быть проблемой. Я попробую. – BRabbit27

2

Если существует ограниченное количество комбинаций, вы можете явно создать экземпляр своего шаблона, позволяя сохранить код отдельно между заголовком и исходными файлами.

Положите это в нижней части исходного файла

template void BarrierBest_checkBarrier<0, 0>(...); 
template void BarrierBest_checkBarrier<0, 1>(...); 
template void BarrierBest_checkBarrier<1, 0>(...); 
template void BarrierBest_checkBarrier<1, 1>(...); 

Если вы хотите, чтобы другие файлы, призывающих вашу функцию, чтобы забрать свои собственные параметры не в этом списке, вы должны поместить весь шаблонный код в файл заголовка.

+0

В исходном файле вы имеете ввиду .hpp или .cpp? Что делать, если BarrierBest_checkBarrier не является частью какого-либо класса? – BRabbit27

+0

Исходный файл = .cpp К сожалению, я не заметил, что BarrierBest_checkBarrier не является частью класса. Я уточню свой ответ. –

+0

Я пытался заставить его работать, но я получил «Нет шаблона экземпляра» BarrierBest_checkBarrier * соответствует указанному типу'. – BRabbit27

Смежные вопросы