Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++11 ';X';不是模板类型,但在MCVE中编译良好_C++11_Templates - Fatal编程技术网

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的原因!:-)我想说错误消息是程序员说的“我已经知道这不是模板”。这可能更清楚。