C++11 ';X';不是模板类型,但在MCVE中编译良好
我决定将代码中的一个类更改为模板。这就产生了C++11 ';X';不是模板类型,但在MCVE中编译良好,c++11,templates,C++11,Templates,我决定将代码中的一个类更改为模板。这就产生了“X”不是模板类型的错误,无论我做了什么更改。最后,我回滚了更改并进行了最简单的更改:我将template放在类前面,因此我有: template <typename T> class X { ... 模板 X类 { ... 仍然得到错误 所以我做了一个MCVE,但效果很好 为什么额外的一行会导致错误 #include <vector> #include <iostream> class A { }; tem
“X”不是模板类型的错误,无论我做了什么更改。最后,我回滚了更改并进行了最简单的更改:我将template
放在类前面,因此我有:
template <typename T>
class X
{
...
模板
X类
{
...
仍然得到错误
所以我做了一个MCVE,但效果很好
为什么额外的一行会导致错误
#include <vector>
#include <iostream>
class A
{
};
template <class D>
class S : public D
{
};
template <class T> // line 13
class OM
{
public:
explicit OM(int a, int b , int c)
{
std::cout << "OM ctor\n";
std::cout << "a = " << a << " , b = " << b << " , c = " << c << " \n";
}
std::vector<A> v;
};
int main(int, const char*[])
{
OM om(1,2,3);
//OM<S<A>> om(1,2,3); // line 28
}
#包括
#包括
甲级
{
};
模板
S类:公共D类
{
};
模板//第13行
OM类
{
公众:
显式OM(整数a、整数b、整数c)
{
std::cout这是一个MCVE,演示了原始问题:
#include <vector>
#include <iostream>
class OM;
class BH
{
public:
BH(OM& om): om_(om) { std::cout << "BH ctor\n"; }
OM& om_;
};
class A
{
};
template <class D>
class S : public D
{
};
template <class T> // line 23
class OM
{
public:
explicit OM(int a, int b , int c)
{
std::cout << "OM ctor\n";
std::cout << "a = " << a << " , b = " << b << " , c = " << c << " \n";
}
std::vector<A> v;
};
int main(int, const char*[])
{
OM om(1,2,3);
//OM<S<A>> om(1,2,3); // line 38
BH bh(om);
}
template_test.cpp:24:7: error: ‘OM’ is not a template type
class OM
^
#包括
#包括
OM类;
BH类
{
公众:
BH(OM&OM):OM_uOm{std::cout如果OM
是一个模板,则不能将其用作类型。例如,尝试使用OM
(在主函数中)在实际应用中,它的使用方式与第28行的演示方式类似。我遇到的问题是,如果我添加一行代码,会出现两个不同的错误。此外,如果它没有演示手头的问题,它也不是真正的MCVE。我编写MCVE是为了得到一个可再现的错误。我没有,所以现在我想知道为什么要添加1行代码f代码可能会导致失败。这个问题本质上要求我们玩一个猜测游戏。在给定的代码中,问题是您正在使用模板作为类型。在您没有向我们展示的代码中,问题是…我猜缺少分号。第一个问题的简单修复(更改所有正向声明)是使用转发声明头。当然,在这个时候,这并不能真正帮助减少您必须做的工作:)。这就是他们发明grep和sed的原因!:-)我想说错误消息是程序员说的“我已经知道这不是模板”。这可能更清楚。