(皆さんご周知の事ではありますが、偶には思い出すべきです故にあえて言いますが)VC6は糞

#include <iostream>

template<typename T>
class A
{
public:

    A()
    {
        std::cout << "A()" << std::endl;
    }

    A(const A<T>& t)
    {
        std::cout << "A<T>()" << std::endl;
    }

    template<typename U>
    A(const A<U>& u)
    {
        std::cout << "A<U>()" << std::endl;
    }

};

int main()
{
    A<int>  int1;
    A<int>  int2(int1);
    A<long> long_(int1);

    return 0;
}
// VC2005
A()
A<T>()
A<U>()

まぁ、当然ですね。

これをまだどこかの中小企業で明らかに現役で使わされているであろう VC++6.0 でコンパイルすると…

>cl /EHsc a.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

a.cpp
a.cpp(21) : error C2535: '__thiscall A<U>::A<U>(const class A<U> &)' : メンバ関数は、すでに定義または宣言されています。
        a.cpp(15) : 'A<T>::A<T>' の宣言を確認してください。
        a.cpp(26) : コンパイルされたクラスのテンプレートのインスタンス化 'A<T>' の参照を確認してください
a.cpp(31) : error C2668: 'A<int>::A<int>' : オーバーロード関数の呼び出しを解決することができません。(新機能 ; ヘルプを参照)

どうやら A(A<T>& t) と A(A<U>& u) がカブっている扱いするようです。

まぁ50歩くらい譲れば気持ちは分からんでもないので、A(A<T>& t) の方を消すとコンパイルが通ります。 A int2(int1); が A(A<U>& t) の方に解決されて、上手くやってくれるのでしょう。

// VC6
A()
A<U>()
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄」
―――――――――――――‐┬┘
                        |
       ____.____    |
     |        |        |   | 
     |        | ∧_∧ |   | 
     |        |( ´∀`)つ ミ | 
     |        |/ ⊃  ノ |   |
        ̄ ̄ ̄ ̄' ̄ ̄ ̄ ̄    |    ミ[VC6]


デフォルトコピーコンストラクタ発動してんじゃねーよ!! コピコン書いただろ! ダメって言っただろ!! なんでコンパイラ自身が自動で用意したのはOKなんだよコンナロー!!

というわけで VC6は糞

で、思いつきでコード弄くった

ホント思いつきで、A<U>() の ctor に "void* vc6_is_kuso = NULL" を追加してみました。

#include <iostream>

template<typename T>
class A
{
public:

    A()
    {
        std::cout << "A()" << std::endl;
    }

    A(const A<T>& t)
    {
        std::cout << "A<T>()" << std::endl;
    }

    template<typename U>
    A(const A<U>& u, void* vc6_is_kuso = NULL)
    {
        std::cout << "A<U>()" << std::endl;
    }

};

int main()
{
    A<int>  int1;
    A<int>  int2(int1);
    A<long> long_(int1);

    return 0;
}
// vc6
>cl /EHsc a.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

a.cpp
Microsoft (R) Incremental Linker Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/out:a.exe
a.obj

>a
A()
A<T>()
A<U>()
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄」
―――――――――――――‐┬┘
                        |
       ____.____    |
     |        |        |   | 
     |        | ∧_∧ |   | 
     |        |( ´∀`)つ ミ | 
     |        |/ ⊃  ノ |   |
        ̄ ̄ ̄ ̄' ̄ ̄ ̄ ̄    |    ミ[VC6] ミ[VB6]