作为类参数的模板对象在编译之前会出错

时间:2016-07-15 09:54:13

标签: c++ templates compilation

以下是代码:

#include <iostream>
using namespace std;

template<class OwnerType>
class Move {
public:
    Move() {}
    Move(OwnerType &_owner) {
        owner = &_owner;
    }
    void GetPosition() {
        cout << owner->x << endl;
    }
    OwnerType *owner;
};

class Entity {
public:
    int x = 50;
    Move<Entity> *move;
};


int main() {        
    Entity en; 
    en.x = 77;
    en.move = new Move<Entity>(en);   // sign '=' is underlined by VS
    en.move->GetPosition();
    return 0;
}

它给出错误:

a value of type "Move<Entity> *" cannot be assigned to an entity of type "Move<Entity> *"

程序正在编译,按预期工作并给出预期值,但错误仍在此处。 这可能与模板和编译时间和内容有关,但我没有足够的知识来知道这个错误实际代表什么。

也不要担心泄漏,因为这只是我测试,错误是我不明白的。

提前致谢。

2 个答案:

答案 0 :(得分:1)

所以它不是错误。

是Intellisense: 见:
Error 'a value of type "X *" cannot be assigned to an entity of type "X *"' when using typedef struct

Visual Studio 2015: Intellisense errors but solution compiles

旧:

您的main需要()

这对我有用:

#include<iostream>
using namespace std;

template<class T> class Move {
public:
    Move() {}
    Move(T &_owner) {
        owner = &_owner;
    }
    void GetPosition() {
        cout << owner->x << endl;
    }
    T *owner;
};

class Entity {
public:
    int x = 50;
    Move<Entity> *move;
};


int main(){
    Entity en;
    en.x = 77;
    en.move = new Move<Entity>(en);   // sign '=' is underlined by VS
    en.move->GetPosition();

    return 0;
}

输出:

77

答案 1 :(得分:1)

Intellisense以显示无效错误而闻名(例如参见Visual Studio 2015: Intellisense errors but solution compiles),信任编译器和链接器,如评论中所示。

但是,此错误非常烦人,请尝试关闭解决方案,删除.suo文件(隐藏),然后重新打开。有关.suo文件的详细信息Solution User Options (.Suo) File

旁注,代码示例main中缺少()