2015-11-20 3 views
2

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

Проще говоря, я хотел бы сделать это:

template<typename T> 
class A {...} 

template<typename T, A<T>& a> 
class B {...} 

int main(){ 
    const A<int> a; 
    B<int, a> b; 

Проблема, я не могу понять, как сделать это произойдет, и мне нужна ваша помощь.

На визуальной студии, приведенный выше код будет производить следующее сообщение об ошибке: «C2971: переменная с нестатической длительности хранения, не может быть использован в качестве не аргумент типа»

Если я пытаюсь использовать constexpr вместо Const, со следующими изменениями:

constexpr A<int> &a = A<int>(3); 
B<int,a> b; 

Я получаю следующее сообщение об ошибке «C2131: выражение не определяется константой»

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

Я, безусловно, делаю что-то неправильно, но не могу понять, что.

Заранее благодарю вас за помощь!

EDIT: Я пробовал ответ, но, к сожалению, даже если сначала кажется, что это нормально, я получил эту ошибку при компиляции: C2970: выражение, связанное с объектами с внутренней связью, не может использоваться как аргумент non-type. Похоже, что я не могу использовать параметр шаблона в другом файле? (Я разделял все классы в разных hpp) Любые идеи?

решаемые: Для того, чтобы решить эту проблему, я использовал решение по настоящему Договору и (я предполагаю, потому что мой класс был в отдельном файле HPP) просто поместить ключевое слово extern, прежде чем иметь:

extern const A<int> a; 
int main(){ B<int, a> b; } 

И это работает как шарм.

+0

переферия [как инициализировать ссылку constexpr] (http://stackoverflow.com/q/28614591/1708801) –

+0

Это ДАЕТ НИКАКИХ смысл. Параметр шаблона не может быть ссылкой. – HolyBlackCat

+0

Andrew: к сожалению, навязывается проектом, поэтому он должен быть параметром шаблона – docky

ответ

2

Вы не можете использовать локальные переменные, поскольку параметры определения типа шаблона не могут быть локализованы, его можно использовать вне локальной области видимости. Но если вы замените шаблон параметров для ссылки на глобальную переменную, которая будет работать:

template<typename T> 
class A { 
    public: 
    A() {} 
}; 

template<typename T, A<T>& a> 
class B { 
    public: 
    B() {} 
}; 

A<int> a; 
int main(){ 
    B<int, a> b; 
} 
+0

OP использует нестатические переменные, поэтому этот ответ не распространяется на проблему OP. –

+0

, почему VS говорит, что это ошибка - и решение не использует локальные переменные –

+0

Без объяснений это только ответ кода и, следовательно, плохой. –

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