2015-11-14 3 views
3

Я долго искал и не нашел ответов на свои проблемы (хотя я пытался применить некоторые методы, которые я нашел). Вот вопрос:C++: шаблон принимает объект шаблона как параметр. Ошибка связи Ошибка

Я должен создать шаблон, который принимает 2 аргумента: и integer и и object (экземпляр другого шаблона). Хотя этот класс шаблонов наследуется от других шаблонов, я думаю, что эти классы не являются частью проблемы. Так вот код:

template <typename Type, const ConPol<Type>& Div> 
class ModPol : public Pol<Type>, public VecF<Type, Div.size()>{ 
private: 
    // 

protected: 
    // 

public: 
    // constructors & destructor 
    ModPol() 
    virtual ~ModPol(); 

}; 

Когда я пытаюсь вызвать этот конкретный класс, я использую эти строки:

const ConPol<int> poly; 
ModPol<int, &poly> modpoly; 

К сожалению, я получаю эту ошибку:

error: non-type template argument refers to object 'poly' that does not have linkage

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

Cheers!

ответ

1

Когда вы объявляете глобальный объект в C++, который равен const, то по умолчанию он имеет внутреннюю связь. Это означает, что объект не связан с каким-либо объектом с тем же именем и типом в других исходных файлах.

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

So poly не разрешен, потому что это const и так имеет внутреннюю сцепление.

Решение переопределить значение по умолчанию и сказать, что вы хотите poly иметь внешнюю связь:

extern const ConPol<int> poly; 
+1

Кроме того, он должен быть проходной «поли» вместо «& поли», как ссылка, как ожидается, не указатель. – dbajgoric

+0

Спасибо вам за ответ, кажется, что он правильно компилируется. Мой компилятор все еще находит ошибки для отдыха: «ошибка: не-типа шаблона аргумента типа „станд :: size_t“(он же„неподписанные долгое“) не является интегралом постоянной выражения» Этой ошибкой, касающееся «Div.size()», но я действительно не понимаю, как обойти это. – TanguyH

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