#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
答案 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)
^