在类定义之外的模板类成员函数体中,何时需要模板参数

In template class member function body outside class definition, when are template parameters required?

本文关键字:何时需 参数 函数体 成员 定义      更新时间:2023-10-16

此代码可编译(Visual Studio 2013)。请注意,我在类定义之外的函数体中传入Set,而不是Set<T>,作为运算符=的参数。但我不能返回Set,也不能让它成为Set的成员;它必须返回CCD_ 5并且是CCD_。

省略模板参数在哪里是合法的?在类定义内部,还有什么?

这是标准的变化吗?我正在努力保持与所有现有版本的兼容性,包括98。

template <typename T>
class Set 
{
public:
    Set() {}         
    const Set& operator=(const Set& rhs); 
    //Shouldn't this have to be 
    //const Set<T>& operator= (const Set<T>& rhs); ?
};
template <typename T>
const Set<T>& Set<T>::operator= (const Set& rhs) //<-- HERE
{
    Set temp;                                    //<-- AND HERE
    /* ... */
    return *this;
}
int main()
{
    Set<int> S, T;
    T = S;
}

类名在类作用域中可用。在一个单独的成员定义中,一旦您传递了C++03返回类型规范和函数名,您就进入了类范围。因此,这在C++03:中是可以的

template< class T >
Set<T> const& Set<T>::operator=( Set const& rhs ) 

这在C++11:中是可以的

template< class T >
auto Set<T>::operator=( Set const& rhs) -> Set const&

这实际上与模板无关,但与访问类范围中可用的名称有关。

例如,在C++03中,您必须编写

struct S
{
    struct Inner {};
    Inner foo();
};
S::Inner S::foo() { return Inner(); }

而使用C++11和更高版本,您可以编写

struct S
{
    struct Inner {};
    auto foo() -> Inner;
};
auto S::foo() -> Inner { return {}; }

这是采用尾随返回类型语法作为单一语法约定的一个很好的理由。


无论哪一年的标准是,这在C或C++中都是不好的

void main() //! NOT VALID.