gpt4 book ai didi

c++ - 奇怪的 C++ 模板方法特化问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:16:02 27 4
gpt4 key购买 nike

我在方法特化方面遇到了一个奇怪的问题。

鉴于此代码...

#include <string>

class X
{
public:

template< typename T >
void set( T v );
};

template<>
void X::set( const std::string & v )
{
}

template<>
void X::set( int v )
{
}

int main( int, char *[] )
{
X x;

std::string y;

x.set( y );

x.set( 1 );
}

当我将它与 g++ 4.3.3 链接时,我得到了一个 undefined reference void X::set<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >) .

这基本上是对 void X::set( std::string ) 的 undefined reference .

所以我的问题是,为什么编译器不使用 const std::string & 的特化? ?

如果我显式调用 x.set< const std::string & >( y )然后编译和链接正常。

最佳答案

这完全是错误的语法。特化模板时,您必须将尖括号包含在您要特化的类型中。例如:

template<typename T>
struct X { ... };

template<>
struct X<int> { ... };
// ^^^^^ see, there have to be angle brackets after the identifier

所以

template<>
void X::set(std::string &) { ... }

没有专门化任何东西,它正在实现

class X {
template<>
void set(std::string &) { ... }
};

这是完全不同的功能。我不明白的是为什么 gcc 没有产生错误,因为该类没有该成员。

现在即使您使用了假定正确的语法,它也不会是正确的,因为正如 Tom 已经回答的那样,您不能专门化函数(只是用非模板版本重载).在 C++03 中,即;在 C++0x 中是允许的。

关于c++ - 奇怪的 C++ 模板方法特化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6814919/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com