ссылка на константную строку в качестве аргумента шаблона, отличного от типа

Я пытаюсь получить ссылку на константную строку в качестве аргумента шаблона, отличного от типа, я не могу пройти мимо этой ошибки компиляции.

тест.ч :

#include <string.h>
#include <iostream>

template<const std::string& V> class TestTmplt
{

};

const std::string& TEST_REF = "TESTREF" ;
typedef  TestTmplt<TEST_REF>  TestRefData ;

test.cpp:

#include <test.h>

template class TestTmplt<TEST_REF> ;

Ошибка компиляции:

./test.h:10:34: error: could not convert template argument âTEST_REFâ to âconst string& {aka const std::basic_string<char>&}â
./test.h:10:49: error: invalid type in declaration before â;â token

Я компилирую Centos Linux, используя следующую команду gcc

g++ -c -MMD -MF test.u -g -D_LINUX -std=c++03 -pthread -Wall -DVALGRIND -Wno-missing-field-initializers -z muldefs -I.  -o test.o test.cpp

person N3Xg3N    schedule 22.04.2015    source источник
comment
Строки создаются во время выполнения, поэтому я не думаю, что вы можете использовать их таким образом.   -  person NathanOliver    schedule 22.04.2015


Ответы (1)


Проблема в том, что TEST_REF относится не к типу std::string, а к типу const std::string &, т.е. это не объект типа std::string и поэтому его нельзя использовать в качестве аргумента шаблона. С небольшим изменением работает:

#include <string>

template<const std::string& V> class TestTmplt
{

};

std::string TEST_REF = "TESTREF";

template class TestTmplt<TEST_REF>;

[Текущий пример]

person Angew is no longer proud of SO    schedule 22.04.2015
comment
у меня проблема в том, что я должен указать несколько версий TEST_REF в .h и использовать в других файлах .cpp, таких как TEST_REF1, TEST_REF2 и так далее. и в test.cpp я определяю все версии. Если я использую ваше решение и определяю TEST_REF1, TEST_REF2, я получаю ошибку связывания нескольких определений в моем исполняемом файле. - person N3Xg3N; 22.04.2015
comment
@ N3Xg3N Это не имеет ничего общего с шаблонами. Используйте extern std::string TEST_REF; в заголовке и определите его в одном исходном файле. - person Angew is no longer proud of SO; 22.04.2015
comment
Привет, Ангью, у меня есть сомнения, делая его extern , не делает его постоянным во времени компиляции. Для аргумента шаблона, отличного от типа, аргумент должен быть константой времени компиляции. делая его внешним, шаблон будет знать значение только во время компоновки, что противоречит основам шаблона. как это работает? - person N3Xg3N; 23.04.2015
comment
@ N3Xg3N Ваш параметр шаблона имеет ссылочный тип, что означает, что фактическим аргументом для него является адрес TEST_REF (и что является действительно константой времени компиляции). - person Angew is no longer proud of SO; 23.04.2015