C++:以模板对象为参数的模板.导致连杆错误

C++ : template taking template object as parameter. Linkage error caused

本文关键字:错误 对象 C++ 参数      更新时间:2023-10-16

我搜索了很长时间,没有找到任何问题的答案(尽管我试图应用我找到的一些技术)。问题是:

我应该创建一个包含两个参数的模板:andinteger和andobject(另一个模板的实例)。尽管这个模板类继承了其他模板,但我认为这些类不是问题的一部分。代码如下:

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;

不幸的是,我得到了这个错误:

错误:非类型模板参数引用了对象"poly"没有链接

我想知道如何能够实例化我的模板类。不要犹豫,用简单的词语来解释(我认为自己是个初学者)。

干杯!

当您在C++中声明一个全局对象为const时,默认情况下它具有内部链接。这意味着该对象与其他源文件中具有相同名称和类型的任何对象都无关。

但有一条规则是,如果您将对对象的引用作为模板参数传递,那么它必须具有外部链接,即无论在哪个文件中使用,都必须是引用完全相同对象的名称。

所以poly是不允许的,因为它是const,所以有内部链接。

解决方案是覆盖默认值,并表示您希望poly具有外部链接:

extern const ConPol<int> poly;