0
#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

4

2 回答 2

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;
}
于 2013-07-25T08:48:07.537 回答
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)
                     ^
于 2013-07-25T09:10:16.467 回答