为什么C ++实例化被完全专业化掩盖的基本模板功能?

特巴布

假设我有一个基本模板功能foo<T>(),其中包含的完全专业化功能T = int基础模板的身体foo<T>()调用另一个模板,Bar<T>::bazfoo<int>()确实没有

如果foo<int>()被写入,则如果没有成员,则编译将失败为什么是这样?我们从不调用基本模板,也不能,因为它被专业化掩盖了!如果从基本模板中删除了对它的引用,可以确认编译成功,我们看到确实按预期调用了的专用版本Bar<int>bazBarfoo()

foo.h

#include <iostream>

template <typename T>
class Bar {};

template <typename T>
void foo(T arg) {
    Bar<T>::foo(); // XXX: error; comment to fix
    std::cout << "using base template" << std::endl;
}

foo.cpp

#include "foo.h"
template <> void foo<int>(int i) {
    std::cout << "specialization" << std::endl;
}

main.cpp

#include "foo.h"

int main(int argc, char **argv) {
    int i = 1;
    foo<int>(i); // prints "specialization" if noted line is commented
    return 0;
}

为什么无法编译?

莫希特·贾恩(Mohit Jain)

您会看到此问题,因为专业化放置在其他编译单元或其他.cpp文件中。放入foo.h以获得预期的行为。

编辑
对于您在处理多定义问题时的评论问题,请检查以下示例。

您可以将专业化的定义移至.cpp文件,并将声明保留在头文件中,如下所示:

foo.h

#include <iostream>

template <typename T>
class Bar {};

template <typename T>
void foo(T arg) {
    Bar<T>::foo();
    std::cout << "using base template" << std::endl;
}

template <>
void foo<int>(int i); // declaration

foo_int.cpp

#include "foo.h"

template<>
void foo<int>(int i)
{
    std::cout << "specialization" << std::endl;
}

main.cpp

#include "foo.h"

void something();

int main(int argc, char **argv) {
    int i = 1;
    foo<int>(i);
    something();
    return 0;
}

something.cpp

#include "foo.h"

void something() {
    int i = 1;
    foo<int>(i);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么不能编译此功能模板专业化?

来自分类Dev

C ++模板专业化

来自分类Dev

C ++部分模板模板专业化

来自分类Dev

为什么不选择模板专业化?

来自分类Dev

为什么这个部分模板专业化失败了?

来自分类Dev

指针的C ++模板专业化?

来自分类Dev

C ++部分模板专业化问题

来自分类Dev

如何防止C ++模板的专业化?

来自分类Dev

C ++模板部分专业化

来自分类Dev

C ++部分模板专业化混淆

来自分类Dev

C ++模板专业化冗余减少

来自分类Dev

C ++模板专业化/重载

来自分类Dev

C ++类模板专业化

来自分类Dev

多条件模板专业化C ++

来自分类Dev

C ++指针模板专业化

来自分类Dev

为什么可变参数模板的模板专业化与非可变模板的专业化不同?

来自分类Dev

在C ++中,为什么模板函数不能具有部分专业化?

来自分类Dev

为什么 Clang 更喜欢主模板而不是 C++17 的专业化?

来自分类Dev

按类型组结合基本类型的C ++模板专业化

来自分类Dev

为什么限制C#泛型的专业化?

来自分类Dev

模板模板的部分专业化的正确语法是什么

来自分类Dev

C ++类模板专业化,而无需重新实现所有功能

来自分类Dev

子模板中的C ++模板专业化

来自分类Dev

签名模板类的C ++模板专业化

来自分类Dev

C ++中多个模板之一的模板专业化

来自分类Dev

我的模板专业化有什么问题?

来自分类Dev

为什么模板和模板专业化实体和类不是?

来自分类Dev

C ++函数完全专业化给出错误

来自分类Dev

我在专业化功能上做错了什么?