2011-06-15 91 views
1

可能重复:
Can the template parameters of a constructor be explicitly specified?模板的构造函数的怪事

我以前question跟进,(我发现这个情况,编辑2)

特出简单的代码:

#include <iostream> 

struct Printer 
{ 
    Printer() { std::cout << "secret code" << std::endl; } 
}; 

template <class A> 
struct Class 
{ 
    template <class B, class C> 
    Class(B arg) 
    { 
     C c; /* the 'secret code' should come from here */ 
     std::cout << arg << std::endl; 
    } 

    Class(double arg) { std::cout << "double" << std::endl; } 
    Class(float arg) { std::cout << "float" << std::endl; } 

    /* this forbids the use of printer in the first parameter */ 
    Class(Printer printer) { throw std::exception(); /* here be dragons */ } 
}; 

int main() 
{ 
    Class<int> c(1.0f); 
    Class<int>* ptr = new Class<int>((double)2.0f); 
    return 0; 
} 

// Can anyone print 'secret code' while creating an object of type 'Class' ? 

详细说明:对于模板构造函数,您可以在对象被实例化时指定一个不属于构造函数参数一部分的模板参数吗?

我认为这是值得一个问题。

回答

2

不,这是不可能的。

没有语法可用于向构造函数模板提供显式模板参数。您只能为整个类模板提供显式的模板参数。

以下来自[temp.arg.explicit](2003措辞,14.8.1/5)的案文涵盖了该场景。虽然该条款不规范,它用来解释给我们的是,作为语法的固有限制,这是不可能的:

注:由于显式模板 参数列表如下功能 模板名称和因为转换 成员函数模板和 构造成员函数模板 被称为不使用功能 名没有办法提供的 显式模板参数列表这些功能模板

这部分来自于您从未实际上明确调用构造函数的事实。当你编写代码时,比如A(),即使看起来好像你是在调用构造函数(“转换成员函数模板和构造函数成员函数模板,但没有使用函数名称”),你并没有像调用函数那样调用构造函数。

+0

我倾向于同意,但是当这个问题最后进行了辩论时,所有明确的是标准本身并不是很清楚。 – 2011-06-15 14:15:21

+0

@詹姆斯:我不关注。 'int'有一个类模板参数,不是? – 2011-06-15 14:16:24

+0

@Tomalak是的。当我点击发送按钮时,我意识到自己的错误,并编辑了我的回复以删除错误的部分。 – 2011-06-15 14:17:22

0

我认为他想知道如何用C实例化这个类为SOMETYPE:

template<typename A> 
class foo 
{ 
    template<typename B, typename C> 
    foo(B b) 
    { 
     C c; 
    } 
}; 

我不知道这是可能的。

+1

答案是否定的,不是。 – 2011-06-15 14:10:03