C++不能将模板模板类与类成员一起使用

C++ cannot use template template class with class member

本文关键字:一起 成员 不能 C++      更新时间:2024-09-23

我可能误解了模板模板类及其在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; };

pq定义为私有成员,而不是公共成员;这会导致b.q在尝试访问q时失败(q.p也会发生这种情况)。

要么使这些成员public,要么classstruct(默认为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;
}

现在将给出有关访问控制的错误消息,您可以通过公开成员来修复该消息。