2016-04-15 4 views
0

このコードはコンパイルされます(Visual Studio 2013)。私は、Set<T>ではなく、Setを、クラス定義の外にある関数本体の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; 
} 
+0

私の知る限り唯一のクラス、彼らが注入されたクラス名 – NathanOliver

+0

、ここを持っているので、これを行います自動設定 :: operator =(const Set&) - > const& ' –

+0

void main'は無効で、多くの(ほとんどの)読者があなたのコードを試してしまうのを防ぎました。私はそれを修正した。質問が具体的なものでない限り、初心者の読者を誤認させ、少数のコンパイラのうちの1つを使用しない限り、あなたのコードをコピーして貼り付けることができないので、 'void main'のコードを投稿しないでくださいそれを受け入れる –

答えて

0

クラス名はクラススコープで利用可能になりました。別のメンバ定義では、C++ 03の戻り値の型指定と関数名を渡すと、クラススコープになります。

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

そして、これはC++ 11でOKです:したがって、これはC++ 03でOKです

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

これは本当に、テンプレートとは何の関係もありません、クラススコープで使用可能な名前にアクセスすることと関係しています。

例えば、C++ 03であなたはC++ 11以降で、あなたが間、一つの良い理由です

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

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

を書くことができますが

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

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

を書く必要があるだろう多くの場合、後続の戻り型の構文を単一の構文規則として採用する必要があります。


Thisかかわらず、今年の標準の、CまたはC++のいずれかでOKではありません: `テンプレート

void main() //! NOT VALID. 
+0

ここにあるものがC++ 98でも有効かどうか知っていますか? –

+0

C++ 03コードはC++ 98コンパイラで有効です。 C++ 03で導入された唯一の新機能は、値の初期化でした。 C++ 03は、当時TC1と呼ばれていたC++ 98の単なる技術的正誤表*でした(これは最初のものでした)。 –

関連する問題