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

时间:2016-04-15 17:32:04

标签: c++ c++98

此代码编译(Visual Studio 2013)。请注意,我将Set而不是Set<T>作为参数传递给operator =,在函数体中,它位于类定义之外。但我不能返回Set或让它成为Set的成员;它必须返回Set<T>并成为Set<T>的成员。

遗漏模板参数在哪里合法? Inside the class definition,以及其他地方?

这是标准的变化吗?我正在努力保持与所有现有版本的兼容性,包括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;
}

1 个答案:

答案 0 :(得分:0)

类名在类范围内可用。在单独的成员定义中,一旦您传递了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 {}; }

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

无论哪个年份的标准,

This在C或C ++中都不行:

void main() //! NOT VALID.