如何在模板构造函数copmiles中使用typedefed类型制作此模板?

时间:2013-07-25 08:20:06

标签: c++ templates

#include <iostream>

template <typename T>
struct W 
{
    typedef T TT; 
    W(const typename W<int>::TT & m)
    {
        std::cout << "here" << std::endl;
    }
};

int main()
{
    int f;
    W<int>k( f );
    return 0;
}

vc11编译,但g ++不起作用。

我的gcc版本:

Using built-in specs. COLLECT_GCC=g++ COLLECT_LTO_WRAPPER=d:/usr/app/mingw-w32/bin/../libexec/gcc/i686-w64-mingw32/4.7 .0/lto-wrapper.exe Target: i686-w64-mingw32 Configured with: ../../../build/gcc/src/configure --target=i686-w64-mingw32 --pr efix=/c/bb/vista64-mingw32/mingw-x86-x86/build/build/root --with-sysroot=/c/bb/v ista64-mingw32/mingw-x86-x86/build/build/root --enable-languages=all,obj-c++ --e nable-fully-dynamic-string --disable-multilib Thread model: win32 gcc version 4.7.0 20111219 (experimental) (GCC)

gcc错误消息: dd.cc:7:27: error: 'TT' in 'struct W<int>' does not name a type

2 个答案:

答案 0 :(得分:0)

不确定它是如何在VC ++中编译的

但是在使用MinGW g ++ 4.7.2进行编译后

 #include <iostream>

template <typename T>
struct W 
{
   typedef T TT; 
    W(const TT & m) // remove typename W<int> or use  W(const  W::TT & m)
    {
        std::cout << "here" << std::endl;
    }
};

int main()
{
    int f;
    W<int> k( f );
    return 0;
}

答案 1 :(得分:0)

你做不到。

为了知道typename W<int>::TT是什么类型,编译器必须实例化W<int>,但是在已经实例化W<int>时它不能这样做,因为类型在这一点上不完整声明构造函数的地方。

完整类型及其构造函数之间存在循环依赖关系。

Clang提供了一个有用的错误:

t.cc:7:22: error: implicit instantiation of template 'W<int>' within its own definition
    W(const typename W<int>::TT & m)
                     ^