gpt4 book ai didi

c++ - undefined reference : dll -> free function -> overloaded operator -> templated struct

转载 作者:太空狗 更新时间:2023-10-29 21:22:51 25 4
gpt4 key购买 nike

我无法为它调用正确的词,所以我就这样命名了。

我有这个 DLL,其中 templated struct 位于 namespace 中,定义了重载运算符 是那些 struct 的非成员(自由函数)。

“VectorX.h”

#ifdef SPECS
#define SPECS __declspec(dllimport)
#else
#define SPECS __declspec(dllexport)
#endif // SPECS

namespace swc
{
template <typename T>
struct Vec3 : Vec2<T>
{
Vec3();
Vec3(T value); //*1
Vec3& operator = (const T scalar); //*1
...
Vec3& operator += (const Vec3<T> &v);
Vec3& operator += (const T scalar);

//*1 w/c of this two are used when I do `Vec3<T> v = 0.0f;` ??
};

//What attribute should I use to make this works?
//It's compiling but it cause undefined reference when I use it.
//Or I have many ambiguous calls here(?)

template<typename T>
/* SPECS, static, extern */ Vec3<T> const operator * (const Vec3<T> &v, const T scalar);
template<typename T>
/* SPECS, static, extern */ Vec3<T> const operator * (const T scalar, const Vec3<T> &v);

typedef Vec3<float> Vec3f;
}

然后我尝试使用它

“测试.cpp”

#include <iostream>

#include "../../VectorX/vectorx.h"

using namespace swc;

Vec3f CalculateBezierPoint(float t, const Vec3f &p0, const Vec3f &p1, const Vec3f &p2, const Vec3f &p3);

int main()
{
...
}

Vec3f CalculateBezierPoint(float t, const Vec3f &p0, const Vec3f &p1, const Vec3f &p2, const Vec3f &p3)
{
float u = 1 - t;
float tt = t * t;
float uu = u * u;
float uuu = uu * u;
float ttt = tt * t;

Vec3f p = uuu; //is it the operator '=' or the constructor Vec3f(T value)?
//**this is where the compiler starts complaining about undefined references.**
p += 3 * uu * t * p1;
p += 3 * u * tt * p2;
p += ttt * p3;

return p0;
}

这个有效 p += 3 * 2 * 1; 但这个无效 p += 3 * 2 * 1 * p1;

我认为是由于我在 namespace 中声明了 overloaded operator of free function 导致了错误,但我不知道还有什么原因做。

最佳答案

当你初始化一个被声明的变量时,比如

Vec3f p = uuu;

您调用复制构造函数。即,格式的构造函数

Vec3(const Vec3<T> &v);

通常编译器可以自动生成这样的构造函数,但如果有任何其他非标准构造函数(如 Vec3(T value); 之一),编译器将不会这样做。这意味着您尝试在没有复制构造函数的情况下调用它。

如果您无法控制 Vec3 类,因此无法添加复制构造函数,则必须改用赋值:

Vec3f p;
p = uuu;

关于c++ - undefined reference : dll -> free function -> overloaded operator -> templated struct,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19830887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com