尽管拼写正确,但Visual Studio无法找到我的方法

时间:2015-09-22 01:25:02

标签: visual-studio c++11

我收到许多未解决的符号错误,我无法弄清楚原因。

此问题的最常见来源似乎是拼写错误的方法名称,忘记使用作用域操作符指示方法属于哪个类,并且忘记在项目中包含.cpp文件。

我已经检查了所有这些问题,但似乎没有一个适用。我告诉它方法属于哪个类(通过Point<T>:: ...),我仔细检查了方法名称,它们都是正确的,.cpp文件显示在解决方案资源管理器中(我甚至尝试将其删除并重新添加)。

我有一段时间没有写过C ++,所以我可能会忽略一些东西,但我看不出来。

(在发布之后,我意识到我的操作员被滑倒了。虽然这不应该影响我的错误,所以请暂时忽略。)

具体来说,这些是我得到的错误:

1>Main.obj : error LNK2019: unresolved external symbol "public: __thiscall Point<int>::Point<int>(int,int)" (??0?$Point@H@@QAE@HH@Z) referenced in function _main
1>Main.obj : error LNK2019: unresolved external symbol "public: class Point<int> __thiscall Point<int>::operator+(class Point<int>)const " (??H?$Point@H@@QBE?AV0@V0@@Z) referenced in function _main
1>Main.obj : error LNK2019: unresolved external symbol "public: class Point<int> __thiscall Point<int>::operator-(class Point<int>)const " (??G?$Point@H@@QBE?AV0@V0@@Z) referenced in function _main
1>Main.obj : error LNK2019: unresolved external symbol "public: class Point<int> __thiscall Point<int>::operator*(class Point<int>)const " (??D?$Point@H@@QBE?AV0@V0@@Z) referenced in function _main
1>Main.obj : error LNK2019: unresolved external symbol "public: class Point<int> __thiscall Point<int>::operator/(class Point<int>)const " (??K?$Point@H@@QBE?AV0@V0@@Z) referenced in function _main
1>Main.obj : error LNK2019: unresolved external symbol "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class Point<int>)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@V?$Point@H@@@Z) referenced in function _main

这些是有问题的文件:

Point.h

#ifndef POINT_H
#define POINT_H

#include <iostream>

template <typename T>
class Point {
    const T x;
    const T y;

public:
    Point(T x, T y);

    Point<T> moveBy(T xOff, T yOff) const;

    Point<T> operator+(const Point<T> otherPoint) const;
    Point<T> operator-(const Point<T> otherPoint) const;
    Point<T> operator*(const Point<T> otherPoint) const;
    Point<T> operator/(const Point<T> otherPoint) const;

    friend std::ostream& operator<<(std::ostream& os, const Point<T> p);

private:
    Point<T> applyOperator(T(*f)(T, T), const Point<T> otherPoint) const;
};

template <typename T>
std::ostream& operator<<(std::ostream& os, const Point<T> p) {
    return os << "(" << p.x << "," << p.y << ")";
}

#endif

Point.cpp:

#include "Point.h"

template <typename T>
Point<T>::Point(T x, T y) :
    x(x),
    y(y) {

}

template <typename T>
Point<T> Point<T>::moveBy(T xOff, T yOff) const {
    return this + Point(xOff, yOff);
}

template <typename T>
Point<T> Point<T>::operator+(const Point<T> otherPoint) const {
    return applyOperator([](x, y) {x + y});
}

template <typename T>
Point<T> Point<T>::operator-(const Point<T> otherPoint) const {
    return applyOperator([](x, y) {x - y});
}

template <typename T>
Point<T> Point<T>::operator*(const Point<T> otherPoint) const {
    return applyOperator([](x, y) {x * y});
}

template <typename T>
Point<T> Point<T>::operator/(const Point<T> otherPoint) const {
    return applyOperator([](x, y) {x / y});
}

template <typename T>
Point<T> Point<T>::applyOperator(T(*f)(T, T), const Point<T> otherPoint) const {
    return Point(f(this.x, otherPoint.x), f(this.y, otherPoint.y));
}

Main.cpp:

#include <iostream>

#include "Point.h"

int main(int argc, char* argv[]) {
    Point<int> p1(1, 2);
    Point<int> p2(2, 3);

    std::cout << p1 << std::endl;
    std::cout << p2 << std::endl;

    Point<int> p3 = p1 + p2;
    Point<int> p4 = p1 - p2;
    Point<int> p5 = p1 * p2;
    Point<int> p6 = p1 / p2;

    std::cout << p3 << std::endl;
    std::cout << p4 << std::endl;
    std::cout << p5 << std::endl;
    std::cout << p6 << std::endl;
}

1 个答案:

答案 0 :(得分:1)

问题是类模板成员函数定义在Point.cpp中,但是在编译此文件时,编译器不知道需要为T = {{1实例化模板}}。事实上,我认为int基本上是空的。

编译器愉快地编译Point.obj并调用Main.cpp的成员 - 期望在链接时提供它们 - 但链接器然后抱怨,因为它无法找到在任何地方定义的成员。

解决方案是(a)将Point的成员函数定义移动到Point<int>,或者(b)通过明确声明该特化来强制Point.hpp Point<int>的实例化:只需添加Point.cpp末尾的template class Point<int>;行。