gpt4 book ai didi

c++ - 为什么可以在命名空间 block 之外定义 template 而不是 template<>?

转载 作者:IT老高 更新时间:2023-10-28 21:53:11 26 4
gpt4 key购买 nike

这是一些无法编译的代码。

namespace ns
{
class foo
{
template <typename T> int bar (T *);
};
}

template <typename T>
int ns :: foo :: bar (T*) // this is OK
{
return 0;
}

template <>
int ns :: foo :: bar <int> (int *) // this is an error
{
return 1;
}

错误是:“'template int ns::foo::bar(T*)' 在不同命名空间 [-fpermissive] 中的特殊化来自'template int ns::foo::bar(T*) 的定义”

这是一个可以编译的版本:

namespace ns
{
class foo
{
template <typename T> int bar (T *);
};
}

template <typename T>
int ns :: foo :: bar (T*)
{
return 0;
}

namespace ns
{
template <>
int foo :: bar <int> (int *)
{
return 1;
}
}

为什么第二个定义必须在 namespace ns {} block 中,而第一个定义非常愉快地使用限定名称定义?这只是语言设计的疏忽还是有原因?

最佳答案

这里的问题不是定义,而是声明。您不能从不同的命名空间中将声明注入(inject)到命名空间中,因此必须在适当的命名空间中声明特化,然后才能在任何封闭的命名空间中定义

基本模板的定义可以在外层命名空间中完成,因为它已经被声明了,所以外层命名空间中的代码提供了一个定义,但没有将任何声明注入(inject)到命名空间中。

试试:

namespace ns {
class foo
{
template <typename T> int bar (T *);
};
template <>
int foo::bar<int>(int*); // declaration
}
template <typename T>
int ns :: foo :: bar (T*) {
return 0;
}
template <>
int ns :: foo :: bar <int> (int *) {
return 1;
}

关于c++ - 为什么可以在命名空间 block 之外定义 template<T> 而不是 template<>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18294990/

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