C++不能将模板模板类与类成员一起使用
C++ cannot use template template class with class member
我可能误解了模板模板类及其在C++中的使用。具有以下声明:
template <typename Parameter>
class A { Parameter p; };
template <template <typename> typename Class, typename Parameter>
class B { Class<Parameter> q; };
B<A, int> b;
b.q.p = 0;
我可以b
声明一个变量,但我不能p
访问类成员,也不能q
。该行会产生以下两个错误:
error: unknown type name 'b'
b.q.p = 0;
^
error: cannot use dot operator on a type
b.q.p = 0;
^
为什么b
不是变量,它还是模板吗?发生了什么事情?
该代码几乎是合法的,但是类具有默认的访问说明符private
,因此您需要将它们标记为public
。此代码有效:
template <typename Parameter>
class A
{
public:
Parameter p;
};
template <template <typename> typename Class, typename Parameter>
class B
{
public:
Class<Parameter> q;
};
int main()
{
B<A, int> b;
b.q.p = 0;
}
你写的代码是正确有效的——直到赋值。
b.q.p = 0;
失败的原因是class
定义默认为所有成员定义private
可访问性,因此:
template <typename Parameter>
class A { Parameter p; };
template <template <typename> typename Class, typename Parameter>
class B { Class<Parameter> q; };
将p
和q
定义为私有成员,而不是公共成员;这会导致b.q
在尝试访问q
时失败(q.p
也会发生这种情况)。
要么使这些成员public
,要么class
struct
(默认为public
),这将起作用:
template <typename Parameter>
struct A { Parameter p; };
template <template <typename> typename Class, typename Parameter>
struct B { Class<Parameter> q; };
现场示例
此错误是因为不允许在函数外部使用语句,除非该语句是声明。错误消息源于编译器尝试将代码分析为声明。这与模板无关;使用更简单的代码,您会看到相同的错误:
struct { int x; } y;
y.x = 0;
尝试的赋值可能发生在函数内部,例如:
int main()
{
b.q.p = 0;
}
现在将给出有关访问控制的错误消息,您可以通过公开成员来修复该消息。
相关文章:
- C++ 如何将关键字"friend"与两个类的成员函数一起使用 相互包含
- 与引用一起使用的列表,在用作成员时更改行为
- 在 c++ 中将模板与类一起使用时,类成员函数的答案错误?
- 将 PIMPL 习惯用法与成员函数模板一起使用(无需预先了解所有可能的数据类型)
- 如何将两个类成员函数与同一类中的另一个函数一起添加
- 如何将此指针与指向成员函数的指针一起使用
- 将指令与模板化成员函数一起使用
- 常量变量初始化仅与成员初始化列表一起工作
- 与const成员一起安排新的和班级的分配
- GCC 中的编译器错误,但在将 decltype 与具有尾随返回类型语法的模板化成员函数一起使用时没有 clang
- 将异步与多态成员函数一起使用
- 将GSL与C 一起使用时,如何避免静态成员函数
- boost :: Spirit :: Qi-与语法结构中的实例成员一起工作
- 如何将序列化方法添加到作为Windows数据结构的类成员中,以便在C++中与boost序列化一起使用
- 为什么点运算符(.)可以与私有类成员/方法一起使用
- 将在一行中声明的成员记录在一起,而不创建组
- 获取指向成员std::string::size的指针无法与libc++链接,但可以与libstdc++一起使用
- 如何将尾随返回类型与模板化类成员一起使用
- 与私人成员一起上课.这个代码出了什么问题
- 将 decltype 与虚拟成员函数指针一起使用