模板可能导致函数定义匹配失败
Template Can Cause Function Definition Match Failure
在使用c++11的VS2012中,为什么要编译:
template <typename T>
class Vector2
{
public:
Vector2(); //constructors
T Dot(const Vector2<T>& U, const Vector2<T>& V);
};
template <typename T>
inline T Vector2<T>::Dot(const Vector2<T>& U, const Vector2<T>& V) //ISSUE
{ return (U.x * V.x + U.y * V.y); }
但事实并非如此:
template <typename T>
class Vector2
{
public:
Vector2(); //constructors
template<typename G>
G Dot(const Vector2<G>& U, const Vector2<G>& V);
};
template <typename G>
inline G Vector2<G>::Dot(const Vector2<G>& U, const Vector2<G>& V) //ISSUE
{ return (U.x * V.x + U.y * V.y); }
第二个导致错误:"无法将函数定义与现有声明匹配"
我意识到我不必在后面的模板函数定义中使用G,我只是使用它来与第二个示例声明保持一致
是否不允许在模板类中具有与该类不同类型的函数?我非常感兴趣的是了解这里发生了什么,以及我可以从这个错误中学到的关于模板的任何相关信息。
您有两种模板类型:T
和G
。一个列表(T
)用于类,一个(G
)用于成员函数。因此,您必须有两个列表;一个用于类,然后一个用于函数(并确保正确的类型位于正确的位置,类名后为T
,参数中为G
):
template<typename T>
template<typename G>
inline G Vector2<T>::Dot(const Vector2<G>& U, const Vector2<G>& V)
{ return (U.x * V.x + U.y * V.y); }
您需要两个独立的模板声明:
template <class T>
template <class G>
inline G Vector2<T>::Dot(const Vector2<G>& U, const Vector2<G>& V) {...}
相关文章:
- 自定义对象的dlib序列化在gcc中失败
- 如果我重新定义 sqrt 函数,为什么使用 std::sqrt 失败?
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用) - 体系结构的未定义符号 x86_64:
- 使用自定义访问者时具有自定义类型的提升变体失败(源自 boost::static_visitor)
- 使用用户定义的类型 UDT 实例化 std::atomic<>。如果 UDT 具有虚函数,则 l 墨水将失败。为什么?
- 如何在 Linux 中构建共享库时使未定义引用的链接器失败
- 自定义预期失败的完整错误消息(boost::spirit::x3)
- Android NDK.Build命令失败.未定义的引用.clang++:错误:链接器命令失败,退出代码为1
- thread_local静态成员模板定义:初始化失败,GCC
- std::p作为 std 中定义的unordered_map自定义键的字符串的空气失败并出现模板错误
- Android opencv 3.4.1 Build 命令失败.未定义的引用
- 强制链接器失败并出现多重定义错误,即使包括 --whole-archive
- 针对 QNX 交叉编译后,boost 文件系统 (1.63) 失败并出现未定义的引用错误
- Gtest 在catkin_make run_tests时失败.未定义的引用
- GLFW的最小示例由于架构X86_64的未定义符号而失败
- LLVM-5.0 MakeFile未定义的参考失败
- 在定义失败之前使用constexpr函数
- 为什么我的C++类定义失败
- 特征类型类型定义失败,并显示 C4430