我是新使用模板。作为标题,我有一个非模板类(Obj和ObjBase)和一个模板类pitem。我想让pItem::RefValue()访问obj中的私有成员。
我想下面的行得通:
template<class T>
friend int PItem<T>::getValue();
它不:
错误C2248:“obj::GetValue”:无法访问类“obj”中声明的私有成员
注意:请参阅对正在编译的函数模板实例化“int PItem::GetValue(void)”的引用
编译器投诉:
if (ptr) return ptr->getValue();
class ObjBase
{
public:
ObjBase() {}
~ObjBase(){}
protected:
int value{0};
};
class Obj : public ObjBase
{
template<class T>
class PItem;
template<class T>
friend int PItem<T>::getValue();
public:
Obj(int i) { value = i; };
~Obj() {};
private:
int getValue()
{
return value;
}
};
template<typename T>
class PItem
{
public:
PItem(T* t) { ptr = t; }
~PItem() {}
int getValue() {
if (ptr) return ptr->getValue();
return -1;
}
T* ptr;
};
您在obj
中声明了一个嵌套类模板pitem
,然后friend
声明引用它,而不是在globle作用域中定义的模板。
您应该删除嵌套类模板声明,并将pitem
的定义移动到obj
的定义之前;因为friend
声明要求PItem
是完整类型。
template<typename T>
class PItem
{
public:
PItem(T* t) { ptr = t; }
~PItem() {}
int getValue() {
if (ptr) return ptr->getValue();
return -1;
}
T* ptr;
};
class Obj : public ObjBase
{
template<class T>
friend int PItem<T>::getValue();
public:
Obj(int i) { value = i; };
~Obj() {};
private:
int getValue()
{
return value;
}
};
活着
我想知道如果函数的模板参数包括但不限于类的模板参数,如何使函数成为类的朋友并在类外定义函数。 例如,我有以下模板类和模板朋友函数: 如果我编译: 我会得到以下链接器错误:
我有一个模板化的C++类,它也有一个模板化的成员函数。这个成员函数的模板参数以特定的方式依赖于类的模板参数(请参阅下面的代码)。我正在为其模板参数的两个不同值实例化(而不是专门化)该类。一切都在这一点上进行。但是,如果我调用模板化的成员函数,对第一个实例化对象的调用只会编译,而不会编译第二个。似乎编译器没有为模板类的第二次实例化实例化模板化成员函数。我正在使用“g++filename.cpp”编译
我有一个类模板和一个函数模板定义了一个,它引用要绑定到的模板类型。 我想要的是将< code>make_obj函数声明为< code>friend,这样它可以创建< code>Obj的,但是其他人不能(除了通过copy ctor)。 我尝试了几个朋友声明,包括 和 后者是使< code>make_obj的所有模板实例化成为< code>Obj类的朋友的不太理想的尝试。然而,在这两种情况下,我得到相
我试图在一个模板化的类中获得一个友元函数来编译,但是错误信息和警告我不理解。我已经对这个问题进行了论证。我得到的错误是: prog.cpp:8:57:错误:非类、非变量部分专门化C运算符(const B 掠夺。cpp:15:59:警告:友元声明'C运算符(常量B prog.cpp:15:59:注意:(如果这不是您想要的,请确保函数模板已经声明并添加
我无法使
是否有人知道此显式特化是否有效: clang 主干 (12/3/2013) 给出以下错误: f:...\test.cpp:36:20: 错误: 从类 'O' 中出线定义 “Fun” 没有定义 1生成错误。 任何来自标准的支持参考来证明你的答案将不胜感激! 注意:我有点惊讶这是一个错误——我认为应该为任何以< code >开始实例化“Fun”的模板参数族选择专门化 这是一个叮当的错误还是我期望中的错